Quellcode durchsuchen

nscache bug fixed

nscache caused crash
z3APA3A vor 11 Jahren
Ursprung
Commit
bf8522321f
3 geänderte Dateien mit 13 neuen und 7 gelöschten Zeilen
  1. 6 0
      src/3proxy.c
  2. 5 5
      src/auth.c
  3. 2 2
      src/structures.h

+ 6 - 0
src/3proxy.c

@@ -644,9 +644,11 @@ static int h_proxy(int argc, unsigned char ** argv){
 		childdef.isudp = 0;
 		childdef.service = S_PROXY;
 		childdef.helpmessage = " -n - no NTLM support\n";
+#ifdef NOIPV6
 		if(!resolvfunc || (resolvfunc == myresolver && !dns_table.hashsize)){
 			fprintf(stderr, "[line %d] Warning: no nserver/nscache configured, proxy may run very slow\n", linenum);
 		}
+#endif
 	}
 	else if(!strcmp((char *)argv[0], "pop3p")) {
 		childdef.pf = pop3pchild;
@@ -675,9 +677,11 @@ static int h_proxy(int argc, unsigned char ** argv){
 		childdef.isudp = 0;
 		childdef.service = S_SOCKS;
 		childdef.helpmessage = " -n - no NTLM support\n";
+#ifdef NOIPV6
 		if(!resolvfunc || (resolvfunc == myresolver && !dns_table.hashsize)){
 			fprintf(stderr, "[line %d] Warning: no nserver/nscache configured, socks may run very slow\n", linenum);
 		}
+#endif
 	}
 	else if(!strcmp((char *)argv[0], "tcppm")) {
 		childdef.pf = tcppmchild;
@@ -721,9 +725,11 @@ static int h_proxy(int argc, unsigned char ** argv){
 		childdef.isudp = 1;
 		childdef.service = S_DNSPR;
 		childdef.helpmessage = " -s - simple DNS forwarding - do not use 3proxy resolver / name cache\n";
+#ifndef NOIPV6
 		if(!resolvfunc || (resolvfunc == myresolver && !dns_table.hashsize) || resolvfunc == fakeresolver){
 			fprintf(stderr, "[line %d] Warning: no nserver/nscache configured, dnspr will not work as expected\n", linenum);
 		}
+#endif
 	}
 	return start_proxy_thread(&ch);
 }

+ 5 - 5
src/auth.c

@@ -842,8 +842,8 @@ struct auth authfuncs[] = {
 
 
 
-struct hashtable dns_table = {0, 4, {0}, NULL, NULL, NULL};
-struct hashtable dns6_table = {0, 16, {0}, NULL, NULL, NULL};
+struct hashtable dns_table = {0, 4, {0,0,0,0}, NULL, NULL, NULL};
+struct hashtable dns6_table = {0, 16, {0,0,0,0}, NULL, NULL, NULL};
 
 
 void nametohash(const unsigned char * name, unsigned char *hash, unsigned char *rnd){
@@ -882,7 +882,7 @@ void destroyhashtable(struct hashtable *ht){
 	pthread_mutex_unlock(&hash_mutex);
 }
 
-#define hvalue(i) ((struct hashentry *)((char *)ht->hashvalues + i*(sizeof(struct hashentry) + ht->recsize - 4)))
+#define hvalue(I) ((struct hashentry *)((char *)ht->hashvalues + (I)*(sizeof(struct hashentry) + ht->recsize - 4)))
 int inithashtable(struct hashtable *ht, unsigned nhashsize){
 	unsigned i;
 	clock_t c;
@@ -981,9 +981,9 @@ unsigned long hashresolv(struct hashtable *ht, const unsigned char* name, unsign
 			ht->hashempty = he;
 		}
 		else if(!memcmp(hash, he->hash, sizeof(unsigned)*4)){
-			pthread_mutex_unlock(&hash_mutex);
 			if(ttl) *ttl = (unsigned)(he->expires - conf.time);
 			memcpy(value, he->value, ht->recsize);
+			pthread_mutex_unlock(&hash_mutex);
 			return 1;
 		}
 		else hep=&(he->next);
@@ -1142,7 +1142,7 @@ unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, un
 				}
 				ttl = ntohl(*(unsigned long *)(buf + k + 6));
 				memcpy(value, buf + k + 12, af == AF_INET6? 16:4);
-				if(ttl < 60 || ((unsigned)t)+ttl < ttl) ttl = 300;
+				if(ttl < 60 || ttl > (3600*12)) ttl = 300;
 				if(ttl){
 					hashadd(af == AF_INET6?&dns6_table:&dns_table, name, value, conf.time+ttl);
 

+ 2 - 2
src/structures.h

@@ -104,11 +104,11 @@ int
 
 #ifndef NOIPV6
 #define SAPORT(sa)  (((struct sockaddr_in *)sa)->sin_family == AF_INET6? &((struct sockaddr_in6 *)sa)->sin6_port : &((struct sockaddr_in *)sa)->sin_port)
-#define SAADDR(sa)  (((struct sockaddr_in *)sa)->sin_family == AF_INET6? (unsigned char *)((struct sockaddr_in6 *)sa)->sin6_addr.u.Byte : (unsigned char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr)
+#define SAADDR(sa)  (((struct sockaddr_in *)sa)->sin_family == AF_INET6? (unsigned char *)&((struct sockaddr_in6 *)sa)->sin6_addr : (unsigned char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr)
 #define SAADDRLEN(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? 16:4)
 #define SASOCK(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? PF_INET6:PF_INET)
 #define SASIZE(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? sizeof(struct sockaddr_in6):sizeof(struct sockaddr_in))
-#define SAISNULL(sa) (!memcmp(((struct sockaddr_in *)sa)->sin_family == AF_INET6? (unsigned char *)((struct sockaddr_in6 *)sa)->sin6_addr.u.Byte : (unsigned char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr, NULLADDR,  (((struct sockaddr_in *)sa)->sin_family == AF_INET6? 16:4))) 
+#define SAISNULL(sa) (!memcmp(((struct sockaddr_in *)sa)->sin_family == AF_INET6? (unsigned char *)&((struct sockaddr_in6 *)sa)->sin6_addr : (unsigned char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr, NULLADDR,  (((struct sockaddr_in *)sa)->sin_family == AF_INET6? 16:4))) 
 #else
 #define SAPORT(sa)  (&((struct sockaddr_in *)sa)->sin_port)
 #define SAADDR(sa)  ((unsigned char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr)