From bf8522321f8291627d3955109e1e83db9c1028f2 Mon Sep 17 00:00:00 2001 From: z3APA3A <3APA3A@3proxy.ru> Date: Wed, 17 Dec 2014 00:20:21 +0300 Subject: [PATCH] nscache bug fixed nscache caused crash --- src/3proxy.c | 6 ++++++ src/auth.c | 10 +++++----- src/structures.h | 4 ++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/3proxy.c b/src/3proxy.c index 8f7a10d..09835e9 100644 --- a/src/3proxy.c +++ b/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); } diff --git a/src/auth.c b/src/auth.c index 155517d..7ebc99b 100644 --- a/src/auth.c +++ b/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); diff --git a/src/structures.h b/src/structures.h index 9b0f26a..16b065e 100644 --- a/src/structures.h +++ b/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)