mirror of
https://github.com/3proxy/3proxy.git
synced 2025-02-24 02:55:40 +08:00
nscache bug fixed
nscache caused crash
This commit is contained in:
parent
5844e165b5
commit
bf8522321f
@ -644,9 +644,11 @@ static int h_proxy(int argc, unsigned char ** argv){
|
|||||||
childdef.isudp = 0;
|
childdef.isudp = 0;
|
||||||
childdef.service = S_PROXY;
|
childdef.service = S_PROXY;
|
||||||
childdef.helpmessage = " -n - no NTLM support\n";
|
childdef.helpmessage = " -n - no NTLM support\n";
|
||||||
|
#ifdef NOIPV6
|
||||||
if(!resolvfunc || (resolvfunc == myresolver && !dns_table.hashsize)){
|
if(!resolvfunc || (resolvfunc == myresolver && !dns_table.hashsize)){
|
||||||
fprintf(stderr, "[line %d] Warning: no nserver/nscache configured, proxy may run very slow\n", linenum);
|
fprintf(stderr, "[line %d] Warning: no nserver/nscache configured, proxy may run very slow\n", linenum);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else if(!strcmp((char *)argv[0], "pop3p")) {
|
else if(!strcmp((char *)argv[0], "pop3p")) {
|
||||||
childdef.pf = pop3pchild;
|
childdef.pf = pop3pchild;
|
||||||
@ -675,9 +677,11 @@ static int h_proxy(int argc, unsigned char ** argv){
|
|||||||
childdef.isudp = 0;
|
childdef.isudp = 0;
|
||||||
childdef.service = S_SOCKS;
|
childdef.service = S_SOCKS;
|
||||||
childdef.helpmessage = " -n - no NTLM support\n";
|
childdef.helpmessage = " -n - no NTLM support\n";
|
||||||
|
#ifdef NOIPV6
|
||||||
if(!resolvfunc || (resolvfunc == myresolver && !dns_table.hashsize)){
|
if(!resolvfunc || (resolvfunc == myresolver && !dns_table.hashsize)){
|
||||||
fprintf(stderr, "[line %d] Warning: no nserver/nscache configured, socks may run very slow\n", linenum);
|
fprintf(stderr, "[line %d] Warning: no nserver/nscache configured, socks may run very slow\n", linenum);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else if(!strcmp((char *)argv[0], "tcppm")) {
|
else if(!strcmp((char *)argv[0], "tcppm")) {
|
||||||
childdef.pf = tcppmchild;
|
childdef.pf = tcppmchild;
|
||||||
@ -721,9 +725,11 @@ static int h_proxy(int argc, unsigned char ** argv){
|
|||||||
childdef.isudp = 1;
|
childdef.isudp = 1;
|
||||||
childdef.service = S_DNSPR;
|
childdef.service = S_DNSPR;
|
||||||
childdef.helpmessage = " -s - simple DNS forwarding - do not use 3proxy resolver / name cache\n";
|
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){
|
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);
|
fprintf(stderr, "[line %d] Warning: no nserver/nscache configured, dnspr will not work as expected\n", linenum);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
return start_proxy_thread(&ch);
|
return start_proxy_thread(&ch);
|
||||||
}
|
}
|
||||||
|
10
src/auth.c
10
src/auth.c
@ -842,8 +842,8 @@ struct auth authfuncs[] = {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct hashtable dns_table = {0, 4, {0}, NULL, NULL, NULL};
|
struct hashtable dns_table = {0, 4, {0,0,0,0}, NULL, NULL, NULL};
|
||||||
struct hashtable dns6_table = {0, 16, {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){
|
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);
|
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){
|
int inithashtable(struct hashtable *ht, unsigned nhashsize){
|
||||||
unsigned i;
|
unsigned i;
|
||||||
clock_t c;
|
clock_t c;
|
||||||
@ -981,9 +981,9 @@ unsigned long hashresolv(struct hashtable *ht, const unsigned char* name, unsign
|
|||||||
ht->hashempty = he;
|
ht->hashempty = he;
|
||||||
}
|
}
|
||||||
else if(!memcmp(hash, he->hash, sizeof(unsigned)*4)){
|
else if(!memcmp(hash, he->hash, sizeof(unsigned)*4)){
|
||||||
pthread_mutex_unlock(&hash_mutex);
|
|
||||||
if(ttl) *ttl = (unsigned)(he->expires - conf.time);
|
if(ttl) *ttl = (unsigned)(he->expires - conf.time);
|
||||||
memcpy(value, he->value, ht->recsize);
|
memcpy(value, he->value, ht->recsize);
|
||||||
|
pthread_mutex_unlock(&hash_mutex);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else hep=&(he->next);
|
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));
|
ttl = ntohl(*(unsigned long *)(buf + k + 6));
|
||||||
memcpy(value, buf + k + 12, af == AF_INET6? 16:4);
|
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){
|
if(ttl){
|
||||||
hashadd(af == AF_INET6?&dns6_table:&dns_table, name, value, conf.time+ttl);
|
hashadd(af == AF_INET6?&dns6_table:&dns_table, name, value, conf.time+ttl);
|
||||||
|
|
||||||
|
@ -104,11 +104,11 @@ int
|
|||||||
|
|
||||||
#ifndef NOIPV6
|
#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 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 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 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 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
|
#else
|
||||||
#define SAPORT(sa) (&((struct sockaddr_in *)sa)->sin_port)
|
#define SAPORT(sa) (&((struct sockaddr_in *)sa)->sin_port)
|
||||||
#define SAADDR(sa) ((unsigned char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr)
|
#define SAADDR(sa) ((unsigned char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr)
|
||||||
|
Loading…
Reference in New Issue
Block a user