diff --git a/src/common.c b/src/common.c index 9e3cb25..9550393 100644 --- a/src/common.c +++ b/src/common.c @@ -221,30 +221,34 @@ int ceparseargs(const char *str){ #endif -void parsehost(int family, unsigned char *host, struct sockaddr *sa){ +int parsehost(int family, unsigned char *host, struct sockaddr *sa){ char *sp=NULL,*se=NULL; - unsigned short port; + unsigned short port=0; + int ret = 0; + if(!host) return 2; if(*host == '[') se=strchr((char *)host, ']'); - if ( (sp = strchr(se?se:(char *)host, ':')) ) *sp = 0; + if ( (sp = strchr(se?se:(char *)host, ':')) && !strchr(sp+1, ':')) *sp = 0; if(se){ *se = 0; } if(sp){ port = atoi(sp+1); } - getip46(family, host + (se!=0), (struct sockaddr *)sa); + ret = !getip46(family, host + (se!=0), (struct sockaddr *)sa); if(se) *se = ']'; if(sp) *sp = ':'; - *SAPORT(sa) = htons(port); + if(port)*SAPORT(sa) = htons(port); + return ret; } int parsehostname(char *hostname, struct clientparam *param, unsigned short port){ char *sp=NULL,*se=NULL; + int ret = 0; - if(!hostname || !*hostname)return 1; + if(!hostname || !*hostname)return 2; if(*hostname == '[') se=strchr(hostname, ']'); - if ( (sp = strchr(se?se:hostname, ':')) ) *sp = 0; + if ( (sp = strchr(se?se:hostname, ':')) && !strchr(sp+1, ':')) *sp = 0; if(se){ *se = 0; } @@ -255,12 +259,12 @@ int parsehostname(char *hostname, struct clientparam *param, unsigned short port if(sp){ port = atoi(sp+1); } - getip46(param->srv->family, param->hostname, (struct sockaddr *)¶m->req); + ret = !getip46(param->srv->family, param->hostname, (struct sockaddr *)¶m->req); if(se) *se = ']'; if(sp) *sp = ':'; *SAPORT(¶m->req) = htons(port); memset(¶m->sinsr, 0, sizeof(param->sinsr)); - return 0; + return ret; } int parseusername(char *username, struct clientparam *param, int extpasswd){ diff --git a/src/conf.c b/src/conf.c index 632acf8..735a222 100644 --- a/src/conf.c +++ b/src/conf.c @@ -563,8 +563,8 @@ static int h_nserver(int argc, unsigned char **argv){ if(numservers < MAXNSERVERS) { if((str = strchr((char *)argv[1], '/'))) *str = 0; - if(!getip46(46, argv[1], (struct sockaddr *)&nservers[numservers].addr)) return 1; *SAPORT(&nservers[numservers].addr) = htons(53); + if(parsehost(46, argv[1], (struct sockaddr *)&nservers[numservers].addr)) return 1; if(str) { nservers[numservers].usetcp = strstr(str + 1, "tcp")? 1:0; *str = '/'; @@ -581,7 +581,7 @@ static int h_authnserver(int argc, unsigned char **argv){ if((str = strchr((char *)argv[1], '/'))) *str = 0; - if(!getip46(46, argv[1], (struct sockaddr *)&authnserver.addr)) return 1; + if(parsehost(46, argv[1], (struct sockaddr *)&authnserver.addr)) return 1; *SAPORT(&authnserver.addr) = htons(53); if(str) { authnserver.usetcp = strstr(str + 1, "tcp")? 1:0; diff --git a/src/proxy.h b/src/proxy.h index 3c93658..061cfff 100644 --- a/src/proxy.h +++ b/src/proxy.h @@ -233,7 +233,7 @@ void mschap(const unsigned char *win_password, struct hashtable; void hashadd(struct hashtable *ht, const unsigned char* name, unsigned char* value, time_t expires); -void parsehost(int family, unsigned char *host, struct sockaddr *sa); +int parsehost(int family, unsigned char *host, struct sockaddr *sa); int parsehostname(char *hostname, struct clientparam *param, unsigned short port); int parseusername(char *username, struct clientparam *param, int extpasswd); int parseconnusername(char *username, struct clientparam *param, int extpasswd, unsigned short port);