From c7310a20608a93b0e9a20835e9e37093aa3ecb5c Mon Sep 17 00:00:00 2001 From: z3APA3A <3APA3A@3proxy.ru> Date: Sun, 19 Oct 2014 21:54:24 +0400 Subject: [PATCH] initial partial patches for IPv6 client support --- src/3proxy.c | 2 + src/Makefile.inc | 15 +---- src/auth.c | 2 + src/common.c | 4 ++ src/ftppr.c | 2 +- src/icqpr.c | 2 +- src/plugins.c | 14 +++-- src/pop3p.c | 2 +- src/proxy.c | 13 ----- src/proxymain.c | 13 +++-- src/smtpp.c | 10 ++-- src/sockgetchar.c | 4 +- src/sockmap.c | 4 +- src/socks.c | 146 +++++++++++++++++++++++----------------------- src/stringtable.c | 5 +- src/structures.h | 17 +++--- src/udppm.c | 20 +++---- src/version.h | 2 +- 18 files changed, 134 insertions(+), 143 deletions(-) diff --git a/src/3proxy.c b/src/3proxy.c index 1cd8d15..a25b882 100644 --- a/src/3proxy.c +++ b/src/3proxy.c @@ -694,6 +694,7 @@ static int h_proxy(int argc, unsigned char ** argv){ childdef.service = S_ICQPR; childdef.helpmessage = ""; } +/* else if(!strcmp((char *)argv[0], "msnpr")) { childdef.pf = msnprchild; childdef.port = 0; @@ -701,6 +702,7 @@ static int h_proxy(int argc, unsigned char ** argv){ childdef.service = S_MSNPR; childdef.helpmessage = ""; } +*/ else if(!strcmp((char *)argv[0], "udppm")) { childdef.pf = udppmchild; childdef.port = 0; diff --git a/src/Makefile.inc b/src/Makefile.inc index 96176d7..f134c9f 100644 --- a/src/Makefile.inc +++ b/src/Makefile.inc @@ -3,7 +3,7 @@ # 3 proxy common Makefile # -all: pre $(VERFILE) $(BUILDDIR)3proxy$(EXESUFFICS) $(BUILDDIR)mycrypt$(EXESUFFICS) $(BUILDDIR)dighosts$(EXESUFFICS) $(BUILDDIR)pop3p$(EXESUFFICS) $(BUILDDIR)smtpp$(EXESUFFICS) $(BUILDDIR)ftppr$(EXESUFFICS) $(BUILDDIR)tcppm$(EXESUFFICS) $(BUILDDIR)icqpr$(EXESUFFICS) $(BUILDDIR)msnpr$(EXESUFFICS) $(BUILDDIR)udppm$(EXESUFFICS) $(BUILDDIR)socks$(EXESUFFICS) $(BUILDDIR)proxy$(EXESUFFICS) $(BUILDDIR)countersutil$(EXESUFFICS) allplugins +all: pre $(BUILDDIR)3proxy$(EXESUFFICS) $(BUILDDIR)mycrypt$(EXESUFFICS) $(BUILDDIR)dighosts$(EXESUFFICS) $(BUILDDIR)pop3p$(EXESUFFICS) $(BUILDDIR)smtpp$(EXESUFFICS) $(BUILDDIR)ftppr$(EXESUFFICS) $(BUILDDIR)tcppm$(EXESUFFICS) $(BUILDDIR)icqpr$(EXESUFFICS) $(BUILDDIR)udppm$(EXESUFFICS) $(BUILDDIR)socks$(EXESUFFICS) $(BUILDDIR)proxy$(EXESUFFICS) $(BUILDDIR)countersutil$(EXESUFFICS) allplugins pre: @@ -53,9 +53,6 @@ tcppm$(OBJSUFFICS): tcppm.c proxy.h structures.h proxymain.c icqpr$(OBJSUFFICS): icqpr.c proxy.h structures.h proxymain.c $(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)PORTMAP icqpr.c -msnpr$(OBJSUFFICS): msnpr.c proxy.h structures.h proxymain.c - $(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)PORTMAP msnpr.c - socks$(OBJSUFFICS): socks.c proxy.h structures.h proxymain.c $(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)NOPORTMAP socks.c @@ -86,9 +83,6 @@ $(BUILDDIR)tcppm$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) tcp $(BUILDDIR)icqpr$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) icqpr$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(LN) $(LNOUT)$(BUILDDIR)icqpr$(EXESUFFICS) $(LDFLAGS) $(VERFILE) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) icqpr$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS) -$(BUILDDIR)msnpr$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) msnpr$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) - $(LN) $(LNOUT)$(BUILDDIR)msnpr$(EXESUFFICS) $(LDFLAGS) $(VERFILE) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) msnpr$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS) - $(BUILDDIR)udppm$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) udppm$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(LN) $(LNOUT)$(BUILDDIR)udppm$(EXESUFFICS) $(LDFLAGS) $(VERFILE) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) udppm$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS) @@ -115,9 +109,6 @@ srvtcppm$(OBJSUFFICS): tcppm.c proxy.h structures.h srvicqpr$(OBJSUFFICS): icqpr.c proxy.h structures.h $(CC) $(COUT)srvicqpr$(OBJSUFFICS) $(CFLAGS) icqpr.c -srvmsnpr$(OBJSUFFICS): msnpr.c proxy.h structures.h - $(CC) $(COUT)srvmsnpr$(OBJSUFFICS) $(CFLAGS) msnpr.c - srvsocks$(OBJSUFFICS): socks.c proxy.h structures.h $(CC) $(COUT)srvsocks$(OBJSUFFICS) $(CFLAGS) socks.c @@ -174,8 +165,8 @@ ntlm$(OBJSUFFICS): ntlm.c stringtable$(OBJSUFFICS): stringtable.c $(CC) $(COUT)stringtable$(OBJSUFFICS) $(CFLAGS) stringtable.c -$(BUILDDIR)3proxy$(EXESUFFICS): 3proxy$(OBJSUFFICS) mainfunc$(OBJSUFFICS) srvproxy$(OBJSUFFICS) srvpop3p$(OBJSUFFICS) srvsmtpp$(OBJSUFFICS) srvftppr$(OBJSUFFICS) srvsocks$(OBJSUFFICS) srvtcppm$(OBJSUFFICS) srvicqpr$(OBJSUFFICS) srvmsnpr$(OBJSUFFICS) srvudppm$(OBJSUFFICS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) auth$(OBJSUFFICS) datatypes$(OBJSUFFICS) md4$(OBJSUFFICS) md5$(OBJSUFFICS) mycrypt$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) smbdes$(OBJSUFFICS) ntlm$(OBJSUFFICS) stringtable$(OBJSUFFICS) srvwebadmin$(OBJSUFFICS) srvdnspr$(OBJSUFFICS) plugins$(OBJSUFFICS) $(COMPATLIBS) - $(LN) $(LNOUT)$(BUILDDIR)3proxy$(EXESUFFICS) $(LDFLAGS) $(VERFILE) 3proxy$(OBJSUFFICS) mainfunc$(OBJSUFFICS) auth$(OBJSUFFICS) datatypes$(OBJSUFFICS) srvproxy$(OBJSUFFICS) srvpop3p$(OBJSUFFICS) srvsmtpp$(OBJSUFFICS) srvftppr$(OBJSUFFICS) srvsocks$(OBJSUFFICS) srvtcppm$(OBJSUFFICS) srvicqpr$(OBJSUFFICS) srvmsnpr$(OBJSUFFICS) srvudppm$(OBJSUFFICS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) mycrypt$(OBJSUFFICS) md5$(OBJSUFFICS) md4$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) smbdes$(OBJSUFFICS) ntlm$(OBJSUFFICS) stringtable$(OBJSUFFICS) srvwebadmin$(OBJSUFFICS) srvdnspr$(OBJSUFFICS) plugins$(OBJSUFFICS) $(COMPATLIBS) $(LIBS) +$(BUILDDIR)3proxy$(EXESUFFICS): 3proxy$(OBJSUFFICS) mainfunc$(OBJSUFFICS) srvproxy$(OBJSUFFICS) srvpop3p$(OBJSUFFICS) srvsmtpp$(OBJSUFFICS) srvftppr$(OBJSUFFICS) srvsocks$(OBJSUFFICS) srvtcppm$(OBJSUFFICS) srvicqpr$(OBJSUFFICS) srvudppm$(OBJSUFFICS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) auth$(OBJSUFFICS) datatypes$(OBJSUFFICS) md4$(OBJSUFFICS) md5$(OBJSUFFICS) mycrypt$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) smbdes$(OBJSUFFICS) ntlm$(OBJSUFFICS) stringtable$(OBJSUFFICS) srvwebadmin$(OBJSUFFICS) srvdnspr$(OBJSUFFICS) plugins$(OBJSUFFICS) $(COMPATLIBS) + $(LN) $(LNOUT)$(BUILDDIR)3proxy$(EXESUFFICS) $(LDFLAGS) $(VERFILE) 3proxy$(OBJSUFFICS) mainfunc$(OBJSUFFICS) auth$(OBJSUFFICS) datatypes$(OBJSUFFICS) srvproxy$(OBJSUFFICS) srvpop3p$(OBJSUFFICS) srvsmtpp$(OBJSUFFICS) srvftppr$(OBJSUFFICS) srvsocks$(OBJSUFFICS) srvtcppm$(OBJSUFFICS) srvicqpr$(OBJSUFFICS) srvudppm$(OBJSUFFICS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) mycrypt$(OBJSUFFICS) md5$(OBJSUFFICS) md4$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) smbdes$(OBJSUFFICS) ntlm$(OBJSUFFICS) stringtable$(OBJSUFFICS) srvwebadmin$(OBJSUFFICS) srvdnspr$(OBJSUFFICS) plugins$(OBJSUFFICS) $(COMPATLIBS) $(LIBS) clean: @$(REMOVECOMMAND) *$(OBJSUFFICS) $(COMPFILES) diff --git a/src/auth.c b/src/auth.c index b2bba6e..a3b2831 100644 --- a/src/auth.c +++ b/src/auth.c @@ -260,9 +260,11 @@ int handleredirect(struct clientparam * param, struct ace * acentry){ case R_ICQ: param->redirectfunc = icqprchild; break; +/* case R_MSN: param->redirectfunc = msnprchild; break; +*/ default: param->redirectfunc = proxychild; } diff --git a/src/common.c b/src/common.c index a0b18bd..bf96d55 100644 --- a/src/common.c +++ b/src/common.c @@ -597,6 +597,10 @@ void logsyslog(struct clientparam * param, const unsigned char *s) { int doconnect(struct clientparam * param){ SASIZETYPE size = sizeof(param->sins); struct sockaddr_in bindsa; + + if (*SAFAMILY(¶m->sincr) == *SAFAMILY(¶m->req) && !memcmp(SAADDR(¶m->sincr), SAADDR(¶m->req), SASIZE(param->req)) && + *SAPORT(¶m->sincr) == *SAPORT(¶m->req)) return 519; + if (param->operation == ADMIN || param->operation == DNSRESOLVE || param->operation == BIND || param->operation == UDPASSOC) return 0; if (param->remsock != INVALID_SOCKET){ diff --git a/src/ftppr.c b/src/ftppr.c index 14bc1f1..fe1fb47 100644 --- a/src/ftppr.c +++ b/src/ftppr.c @@ -71,7 +71,7 @@ void * ftpprchild(struct clientparam* param) { param->res = res; if(inbuf && inbuf != BUFSIZE && socksend(param->ctrlsock, buf, inbuf, conf.timeouts[STRING_S])!=inbuf) {RETURN (807);} if(!res) status = 3; - sprintf((char *)buf, "%.64s@%.128s%c%hu", param->extusername, param->hostname, (ntohs(param->sins.sin_port)==21)?0:':', ntohs(param->sins.sin_port)); + sprintf((char *)buf, "%.64s@%.128s%c%hu", param->extusername, param->hostname, (ntohs(*SAPORT(¶m->sinsr))==21)?0:':', ntohs(*SAPORT(¶m->sinsr))); req = mystrdup((char *)buf); #ifndef WITHMAIN { diff --git a/src/icqpr.c b/src/icqpr.c index 04abaf6..6aa5760 100644 --- a/src/icqpr.c +++ b/src/icqpr.c @@ -105,7 +105,7 @@ static void addbuffer(int increment, struct clientparam * param, unsigned char * *buf_p = newbuf; *bufsize_p = bufsize; } - if(increment) len = sockrecvfrom(param->remsock, (struct sockaddr *)¶m->sins, *buf_p + *length_p, increment, conf.timeouts[STRING_S]*1000); + if(increment) len = sockrecvfrom(param->remsock, (struct sockaddr *)¶m->sinsr, *buf_p + *length_p, increment, conf.timeouts[STRING_S]*1000); if(len > 0) { *length_p += len; param->nreads++; diff --git a/src/plugins.c b/src/plugins.c index 0891cb0..7820822 100644 --- a/src/plugins.c +++ b/src/plugins.c @@ -70,13 +70,15 @@ struct symbol symbols[] = { {symbols+42, "ftppr", (void *) ftpprchild}, {symbols+43, "smtpp", (void *) smtppchild}, {symbols+44, "icqpr", (void *) icqprchild}, +/* {symbols+45, "msnpr", (void *) msnprchild}, - {symbols+46, "authfuncs", (void *) &authfuncs}, - {symbols+47, "commandhandlers", (void *) &commandhandlers}, - {symbols+48, "decodeurl", (void *) decodeurl}, - {symbols+49, "parsestr", (void *) parsestr}, - {symbols+50, "make_ace", (void *) make_ace}, - {symbols+51, "freeacl", (void *) freeacl}, +*/ + {symbols+45, "authfuncs", (void *) &authfuncs}, + {symbols+46, "commandhandlers", (void *) &commandhandlers}, + {symbols+47, "decodeurl", (void *) decodeurl}, + {symbols+48, "parsestr", (void *) parsestr}, + {symbols+49, "make_ace", (void *) make_ace}, + {symbols+50, "freeacl", (void *) freeacl}, {NULL, "", NULL} }; diff --git a/src/pop3p.c b/src/pop3p.c index c3a7ef6..b76a77a 100644 --- a/src/pop3p.c +++ b/src/pop3p.c @@ -49,7 +49,7 @@ void * pop3pchild(struct clientparam* param) { CLEANRET: if(param->hostname&¶m->extusername) { - sprintf((char *)buf, "%.64s@%.128s%c%hu", param->extusername, param->hostname, (ntohs(param->sins.sin_port)==110)?0:':', ntohs(param->sins.sin_port)); + sprintf((char *)buf, "%.64s@%.128s%c%hu", param->extusername, param->hostname, (*SAPORT(¶m->sinsr)==110)?0:':', ntohs(*SAPORT(¶m->sinsr))); (*param->srv->logfunc)(param, buf); } else (*param->srv->logfunc)(param, NULL); diff --git a/src/proxy.c b/src/proxy.c index 1889222..827ef85 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -229,7 +229,6 @@ void * proxychild(struct clientparam* param) { int authenticate; struct pollfd fds[2]; SOCKET ftps; - SASIZETYPE sasize; #ifndef WITHMAIN FILTER_ACTION action; #endif @@ -260,8 +259,6 @@ for(;;){ ckeepalive = 0; so._shutdown(param->remsock, SHUT_RDWR); so._closesocket(param->remsock); - param->sins.sin_addr.s_addr = 0; - param->sins.sin_port = 0; param->remsock = INVALID_SOCKET; param->redirected = 0; param->redirtype = 0; @@ -282,8 +279,6 @@ for(;;){ so._shutdown(param->remsock, SHUT_RDWR); so._closesocket(param->remsock); } - param->sins.sin_addr.s_addr = 0; - param->sins.sin_port = 0; param->remsock = INVALID_SOCKET; param->redirected = 0; param->redirtype = 0; @@ -545,14 +540,6 @@ for(;;){ #endif if((res = (*param->srv->authfunc)(param))) {RETURN(res);} - if (*SAFAMILY(¶m->srv->intsa) == AF_INET && - (param->sins.sin_addr.s_addr == ((struct sockaddr_in *)¶m->srv->intsa)->sin_addr.s_addr && param->sins.sin_port == *SAPORT(¶m->srv->intsa))) { - RETURN(519); - } - sasize = sizeof(struct sockaddr_in); - if(so._getpeername(param->remsock, (struct sockaddr *)¶m->sins, &sasize)){ - RETURN(520); - } #define FTPBUFSIZE 1536 if(ftp && param->redirtype != R_HTTP){ diff --git a/src/proxymain.c b/src/proxymain.c index ab2c5ae..d12d8ee 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -388,10 +388,14 @@ int MODULEMAINFUNC (int argc, char** argv){ } memset(&defparam.sincr, 0, sizeof(defparam.sincr)); memset(&defparam.sincl, 0, sizeof(defparam.sincl)); - memset(&defparam.sins, 0, sizeof(defparam.sins)); + memset(&defparam.sinsl, 0, sizeof(defparam.sinsl)); + memset(&defparam.sinsr, 0, sizeof(defparam.sinsr)); + memset(&defparam.req, 0, sizeof(defparam.req)); *SAFAMILY(&defparam.sincr) = AF_INET; *SAFAMILY(&defparam.sincl) = AF_INET; - *SAFAMILY(&defparam.sins) = AF_INET; + *SAFAMILY(&defparam.sinsl) = AF_INET; + *SAFAMILY(&defparam.sinsr) = AF_INET; + *SAFAMILY(&defparam.req) = AF_INET; srv.fds.fd = sock; srv.fds.events = POLLIN; @@ -544,7 +548,7 @@ void srvinit(struct srvparam * srv, struct clientparam *param){ memset(param, 0, sizeof(struct clientparam)); param->srv = srv; param->remsock = param->clisock = param->ctrlsock = param->ctrlsocksrv = INVALID_SOCKET; - *SAFAMILY(¶m->req) = *SAFAMILY(¶m->sins) = *SAFAMILY(¶m->sincr) = *SAFAMILY(¶m->sincl) = AF_INET; + *SAFAMILY(¶m->req) = *SAFAMILY(¶m->sinsl) = *SAFAMILY(¶m->sinsr) = *SAFAMILY(¶m->sincr) = *SAFAMILY(¶m->sincl) = AF_INET; pthread_mutex_init(&srv->counter_mutex, NULL); memcpy(&srv->intsa, &conf.intsa, sizeof(srv->intsa)); memcpy(&srv->extsa, &conf.extsa, sizeof(srv->extsa)); @@ -567,8 +571,7 @@ void srvinit2(struct srvparam * srv, struct clientparam *param){ } if(srv->logtarget) srv->logtarget = (unsigned char *)mystrdup((char *)srv->logtarget); memcpy(¶m->sincr, &srv->intsa, sizeof(param->sincr)); -/* FIX ME */ - memcpy(¶m->sins, &srv->extsa, sizeof(param->sins)); + memcpy(¶m->sinsl, &srv->extsa, sizeof(param->sinsl)); } void srvfree(struct srvparam * srv){ diff --git a/src/smtpp.c b/src/smtpp.c index 9246117..167b4e0 100644 --- a/src/smtpp.c +++ b/src/smtpp.c @@ -83,7 +83,7 @@ int readdata (struct clientparam* param) { return -1; } #endif - socksendto(param->remsock, (struct sockaddr *)¶m->sins, buf, i, conf.timeouts[STRING_S]); + socksendto(param->remsock, (struct sockaddr *)¶m->sinsr, buf, i, conf.timeouts[STRING_S]); } if(i < 1) { myfree(buf); @@ -99,7 +99,6 @@ void * smtppchild(struct clientparam* param) { int i=0, res; unsigned char buf[320]; unsigned char username[256]; - unsigned long ul; char * command = NULL; int login = 0; @@ -188,8 +187,9 @@ void * smtppchild(struct clientparam* param) { if( i < 3 ) {RETURN(671);} buf[i] = 0; if(strncasecmp((char *)buf, "220", 3)||!strncasecmp((char *)buf+4, "PROXY", 5)){RETURN(672);} - ul = param->extip; - i = sprintf(buf, "EHLO [%lu.%lu.%lu.%lu]\r\n", ((ul&0xFF000000)>>24), ((ul&0x00FF0000)>>16), ((ul&0x0000FF00)>>8), ((ul&0x000000FF))); + i = sprintf(buf, "EHLO ["); + i += myinet_ntop(*SAFAMILY(¶m->sinsl), SAADDR(¶m->sinsl), buf+strlen(buf), 64); + i += sprintf(buf+strlen(buf), "]\r\n"); if(socksend(param->remsock, buf, i, conf.timeouts[STRING_S])!= i) {RETURN(673);} param->statscli64+=i; param->nwrites++; @@ -292,7 +292,7 @@ void * smtppchild(struct clientparam* param) { CLEANRET: if(param->hostname&¶m->extusername) { - sprintf((char *)buf, "%.64s@%.128s%c%hu", param->extusername, param->hostname, (ntohs(param->sins.sin_port)==25)?0:':', ntohs(param->sins.sin_port)); + sprintf((char *)buf, "%.64s@%.128s%c%hu", param->extusername, param->hostname, (ntohs(*SAPORT(¶m->sinsr))==25)?0:':', *SAPORT(¶m->sinsr)); (*param->srv->logfunc)(param, buf); } else (*param->srv->logfunc)(param, NULL); diff --git a/src/sockgetchar.c b/src/sockgetchar.c index 906a4bd..cfaa0f1 100644 --- a/src/sockgetchar.c +++ b/src/sockgetchar.c @@ -123,7 +123,7 @@ int sockfillbuffsrv(struct clientparam * param, unsigned long size, int timeosec } if(size <= param->srvinbuf) return size; size -= param->srvinbuf; - if((len = sockrecvfrom(param->remsock, (struct sockaddr *)¶m->sins, param->srvbuf + param->srvinbuf, (param->srvbufsize - param->srvinbuf) < size? param->srvbufsize - param->srvinbuf:size, timeosec*1000)) > 0){ + if((len = sockrecvfrom(param->remsock, (struct sockaddr *)¶m->sinsr, param->srvbuf + param->srvinbuf, (param->srvbufsize - param->srvinbuf) < size? param->srvbufsize - param->srvinbuf:size, timeosec*1000)) > 0){ param->srvinbuf += len; param->nreads++; param->statssrv64 += len; @@ -148,7 +148,7 @@ int sockgetcharsrv(struct clientparam * param, int timeosec, int timeousec){ return (int)param->srvbuf[param->srvoffset++]; } param->srvoffset = param->srvinbuf = 0; - if ((len = sockrecvfrom(param->remsock, (struct sockaddr *)¶m->sins, param->srvbuf, param->srvbufsize, timeosec*1000 + timeousec))<=0) return EOF; + if ((len = sockrecvfrom(param->remsock, (struct sockaddr *)¶m->sinsr, param->srvbuf, param->srvbufsize, timeosec*1000 + timeousec))<=0) return EOF; param->srvinbuf = len; param->srvoffset = 1; param->nreads++; diff --git a/src/sockmap.c b/src/sockmap.c index 5626d3d..1479a48 100644 --- a/src/sockmap.c +++ b/src/sockmap.c @@ -154,7 +154,7 @@ int sockmap(struct clientparam * param, int timeo){ sl1 = (*param->bandlimfunc)(param, 0, param->cliinbuf - param->clioffset); if(sl1 > sleeptime) sleeptime = sl1; } - res = so._sendto(param->remsock, param->clibuf + param->clioffset, (!param->waitclient64 || (param->waitclient64 - sent) > (param->cliinbuf - param->clioffset))? param->cliinbuf - param->clioffset : (int)(param->waitclient64 - sent), 0, (struct sockaddr*)¶m->sins, sasize); + res = so._sendto(param->remsock, param->clibuf + param->clioffset, (!param->waitclient64 || (param->waitclient64 - sent) > (param->cliinbuf - param->clioffset))? param->cliinbuf - param->clioffset : (int)(param->waitclient64 - sent), 0, (struct sockaddr*)¶m->sinsr, sasize); if(res < 0) { if(errno != EAGAIN && errno != EINTR) return 97; if(errno == EINTR) usleep(SLEEPTIME); @@ -257,7 +257,7 @@ int sockmap(struct clientparam * param, int timeo){ #if DEBUGLEVEL > 2 (*param->srv->logfunc)(param, "flushing buffer to server"); #endif - res = socksendto(param->remsock, (struct sockaddr *)¶m->sins, param->clibuf + param->clioffset, param->cliinbuf - param->clioffset, conf.timeouts[STRING_S] * 1000); + res = socksendto(param->remsock, (struct sockaddr *)¶m->sinsr, param->clibuf + param->clioffset, param->cliinbuf - param->clioffset, conf.timeouts[STRING_S] * 1000); if(res > 0){ param->clioffset += res; param->statscli64 += res; diff --git a/src/socks.c b/src/socks.c index d21ed4e..e8aa81e 100644 --- a/src/socks.c +++ b/src/socks.c @@ -22,6 +22,7 @@ void * sockschild(struct clientparam* param) { SOCKET s; unsigned size; SASIZETYPE sasize; + unsigned short port = 0; unsigned char * buf=NULL; unsigned char c; unsigned char command=0; @@ -29,14 +30,13 @@ void * sockschild(struct clientparam* param) { int ver=0; int havepass = 0; #ifndef NOIPV6 - struct sockaddr_in6 sin; + struct sockaddr_in6 sin = {AF_INET6}; #else - struct sockaddr_in sin; + struct sockaddr_in sin = {AF_INET}; #endif int len; - param->req.sin_addr.s_addr = 0; param->service = S_SOCKS; if(!(buf = myalloc(BUFSIZE))) {RETURN(21);} @@ -86,21 +86,26 @@ void * sockschild(struct clientparam* param) { buf[0] = (unsigned char) res; if ((res = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(441);} buf[1] = (unsigned char) res; - param->sins.sin_port = param->req.sin_port = *(unsigned short*)buf; + port = *(unsigned short*)buf; c = 1; } + size = 4; switch(c) { + case 4: + size = 16; case 1: - for (i = 0; i<4; i++){ + for (i = 0; isins.sin_addr.s_addr = param->req.sin_addr.s_addr = *(unsigned long *)buf; - if(command==1 && !param->req.sin_addr.s_addr) { + *SAFAMILY(¶m->sinsr) = *SAFAMILY(¶m->req) = (c == 1)? AF_INET:AF_INET6; + memcpy(SAADDR(¶m->sinsr), buf, size); + memcpy(SAADDR(¶m->req), buf, size); + if(command==1 && !memcmp(SAADDR(¶m->req), "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", size)) { RETURN(421); } - myinet_ntop(*SAFAMILY(¶m->sins), SAADDR(¶m->sins), (char *)buf, 64); + myinet_ntop(*SAFAMILY(¶m->sinsr), SAADDR(¶m->sinsr), (char *)buf, 64); break; case 3: if ((size = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(451);} /* nmethods */ @@ -109,10 +114,8 @@ void * sockschild(struct clientparam* param) { buf[i] = (unsigned char)res; } buf[i] = 0; - param->sins.sin_addr.s_addr = param->req.sin_addr.s_addr = getip(buf); - if(command==1 && !param->req.sin_addr.s_addr) { - RETURN(100); - } + if(!getip46(param->srv->family, buf, (struct sockaddr *) ¶m->req)) RETURN(100); + memcpy(¶m->sinsr, ¶m->req, sizeof(¶m->req)); break; default: RETURN(997); @@ -124,39 +127,39 @@ void * sockschild(struct clientparam* param) { buf[0] = (unsigned char) res; if ((res = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(441);} buf[1] = (unsigned char) res; - param->sins.sin_port = param->req.sin_port = *(unsigned short*)buf; + port = *(unsigned short*)buf; + } else { sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 1, 0, conf.timeouts[STRING_S]); buf[127] = 0; if(!param->srv->nouser && *buf && !param->username)param->username = (unsigned char *)mystrdup((char *)buf); - if(param->sins.sin_addr.s_addr && ntohl(param->sins.sin_addr.s_addr)<256){ + if(!memcmp(SAADDR(¶m->req), "\0\0\0", 3)){ param->service = S_SOCKS45; sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 1, 0, conf.timeouts[STRING_S]); buf[127] = 0; if(param->hostname)myfree(param->hostname); param->hostname = (unsigned char *)mystrdup((char *)buf); - param->sins.sin_addr.s_addr = param->req.sin_addr.s_addr = getip(buf); + if(!getip46(param->srv->family, buf, (struct sockaddr *) ¶m->req)) RETURN(100); + memcpy(¶m->sinsr, ¶m->req, sizeof(¶m->req)); } } - if(command == 1 && !param->req.sin_port) {RETURN(421);} - param->sins.sin_family = AF_INET; + + *SAPORT(¶m->sinsr) = *SAPORT(¶m->req) = port; + if(command == 1 && !*SAPORT(¶m->sinsr)) {RETURN(421);} switch(command) { case 1: param->operation = CONNECT; break; case 2: - param->sins.sin_addr.s_addr = param->extip; - param->sins.sin_port = param->extport?param->extport:param->req.sin_port; - if ((param->remsock=so._socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {RETURN (11);} - param->operation = BIND; - break; case 3: - param->sins.sin_port = param->extport?param->extport:param->req.sin_port; - param->sins.sin_addr.s_addr = param->extip; - if ((param->remsock=so._socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {RETURN (11);} - param->operation = UDPASSOC; + + memcpy(¶m->sinsl, *SAFAMILY(¶m->req)==AF_INET6? (struct sockaddr *)¶m->srv->extsa6:(struct sockaddr *)¶m->srv->extsa, SASIZE(¶m->req)); + if(!*SAPORT(¶m->sinsl))*SAPORT(¶m->sinsl) = port; + if ((param->remsock=so._socket(*SAFAMILY(¶m->req), command == 2? SOCK_STREAM:SOCK_DGRAM, command == 2?IPPROTO_TCP:IPPROTO_UDP)) == INVALID_SOCKET) {RETURN (11);} + param->operation = command == 2?BIND:UDPASSOC; break; + default: RETURN(997); } @@ -166,25 +169,22 @@ void * sockschild(struct clientparam* param) { } if(command > 1) { - if(so._bind(param->remsock,(struct sockaddr *)¶m->sins,sizeof(param->sins))) { - param->sins.sin_port = 0; - if(so._bind(param->remsock,(struct sockaddr *)¶m->sins,sizeof(param->sins)))RETURN (12); + if(so._bind(param->remsock,(struct sockaddr *)¶m->sinsl,SASIZE(¶m->sinsl))) { + *SAPORT(¶m->sinsl) = 0; + if(so._bind(param->remsock,(struct sockaddr *)¶m->sinsl,SASIZE(¶m->sinsl)))RETURN (12); #if SOCKSTRACE > 0 -fprintf(stderr, "%s:%hu binded to communicate with server\n", - inet_ntoa(param->sins.sin_addr), - ntohs(param->sins.sin_port) - ); +fprintf(stderr, "%hu binded to communicate with server\n", *SAPORT(¶m->sins)); fflush(stderr); #endif } - sasize = sizeof(param->sins); - so._getsockname(param->remsock, (struct sockaddr *)¶m->sins, &sasize); + sasize = SASIZE(¶m->sinsl); + so._getsockname(param->remsock, (struct sockaddr *)¶m->sinsl, &sasize); if(command == 3) { param->ctrlsock = param->clisock; param->clisock = so._socket(SASOCK(¶m->sincr), SOCK_DGRAM, IPPROTO_UDP); if(param->clisock == INVALID_SOCKET) {RETURN(11);} memcpy(&sin, ¶m->sincl, sizeof(&sin)); - *SAPORT(&sin) = htons(0); + *SAPORT(&sin) = 0; if(so._bind(param->clisock,(struct sockaddr *)&sin,sizeof(sin))) {RETURN (12);} #if SOCKSTRACE > 0 fprintf(stderr, "%hu binded to communicate with client\n", @@ -224,10 +224,10 @@ fflush(stderr); buf[0] = 5; buf[1] = repcode; buf[2] = 0; - buf[3] = 1; - memcpy(buf+4, SAADDR(&sin), 4); - memcpy(buf+8, SAPORT(&sin), 2); - socksend((command == 3)?param->ctrlsock:param->clisock, buf, 10, conf.timeouts[STRING_S]); + buf[3] = (*SAFAMILY(&sin) == AF_INET)?1:4; + memcpy(buf+4, SAADDR(&sin), SAADDRLEN(&sin)); + memcpy(buf+4+SAADDRLEN(&sin), SAPORT(&sin), 2); + socksend((command == 3)?param->ctrlsock:param->clisock, buf, 6+SAADDRLEN(&sin), conf.timeouts[STRING_S]); } else{ buf[0] = 0; @@ -252,48 +252,48 @@ fflush(stderr); fds[0].fd = param->remsock; fds[1].fd = param->clisock; fds[0].events = fds[1].events = POLLIN; - res = so._poll(fds, 2, conf.timeouts[(param->req.sin_addr.s_addr)?CONNECTION_S:CONNECTION_L] * 1000); + res = so._poll(fds, 2, conf.timeouts[CONNECTION_L] * 1000); if (res < 1 || fds[1].revents) { res = 460; break; } - sasize = sizeof(param->sins); - s = so._accept(param->remsock, (struct sockaddr *)¶m->sins, &sasize); + sasize = sizeof(param->sinsr); + s = so._accept(param->remsock, (struct sockaddr *)¶m->sinsr, &sasize); so._closesocket(param->remsock); param->remsock = s; if(s == INVALID_SOCKET) { param->res = 462; break; } - if(param->req.sin_addr.s_addr && param->req.sin_addr.s_addr != param->sins.sin_addr.s_addr) { + if(!memcmp(SAADDR(¶m->req),"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",SAADDRLEN(¶m->req)) && + memcmp(SAADDR(¶m->req),SAADDR(¶m->sinsr),SAADDRLEN(¶m->req))) { param->res = 470; break; } #if SOCKSTRACE > 0 -fprintf(stderr, "Sending incoming connection to client with code %d for %s with %s:%hu\n", +fprintf(stderr, "Sending incoming connection to client with code %d for %s with %hu\n", param->res, commands[command], - inet_ntoa(param->sins.sin_addr), - ntohs(param->sins.sin_port) + *SAPORT(param->sins); ); fflush(stderr); #endif if(ver == 5){ - memcpy (buf+4, ¶m->sins.sin_addr, 4); - memcpy (buf+8, ¶m->sins.sin_port, 2); - socksend(param->clisock, buf, 10, conf.timeouts[STRING_S]); + buf[3] = (*SAFAMILY(¶m->sinsr) == AF_INET)?1:4; + memcpy(buf+4, SAADDR(¶m->sinsr), SAADDRLEN(¶m->sinsr)); + memcpy(buf+4+SAADDRLEN(¶m->sinsr), SAPORT(¶m->sinsr), 2); + socksend(param->clisock, buf, 6+SAADDRLEN(¶m->sinsr), conf.timeouts[STRING_S]); } else { - memcpy (buf+2, ¶m->sins.sin_port, 2); - memcpy (buf+4, ¶m->sins.sin_addr, 4); + memcpy (buf+2, SAPORT(¶m->sinsr), 2); + memcpy (buf+4, SAADDR(¶m->sinsr), 4); socksend(param->clisock, buf, 8, conf.timeouts[STRING_S]); } param->res = sockmap(param, conf.timeouts[CONNECTION_S]); break; case 3: - param->sins.sin_addr.s_addr = param->req.sin_addr.s_addr; - param->sins.sin_port = param->req.sin_port; + memcpy(¶m->sinsr, ¶m->req, sizeof(param->sinsr)); myfree(buf); if(!(buf = myalloc(LARGEBUFSIZE))) {RETURN(21);} @@ -326,10 +326,14 @@ fflush(stderr); param->res = 466; break; } + size = 4; switch(buf[3]) { + case 4: + size = 16; case 1: - i = 8; - memcpy(¶m->sins.sin_addr.s_addr, buf+4, 4); + i = 4+size; + memcpy(SAADDR(¶m->sinsr), buf+4, size); + *SAFAMILY(¶m->sinsr) = (size == 4)?AF_INET:AF_INET6; break; case 3: size = buf[4]; @@ -337,18 +341,18 @@ fflush(stderr); buf[i] = buf[i+1]; } buf[i++] = 0; - param->sins.sin_addr.s_addr = getip(buf+4); + if(!getip46(param->srv->family, buf, (struct sockaddr *) ¶m->sinsr)) RETURN(100); break; default: RETURN(997); } - memcpy(¶m->sins.sin_port, buf+i, 2); + memcpy(SAPORT(¶m->sinsr), buf+i, 2); i+=2; - sasize = sizeof(param->sins); + sasize = sizeof(param->sinsr); if(len > (int)i){ - if(socksendto(param->remsock, (struct sockaddr *)¶m->sins, buf+i, len - i, conf.timeouts[SINGLEBYTE_L]*1000) <= 0){ + if(socksendto(param->remsock, (struct sockaddr *)¶m->sinsr, buf+i, len - i, conf.timeouts[SINGLEBYTE_L]*1000) <= 0){ param->res = 467; break; } @@ -371,27 +375,25 @@ fflush(stderr); } if (fds[0].revents) { - struct sockaddr_in tsin; - sasize = sizeof(tsin); + sasize = sizeof(param->sinsr); buf[0]=buf[1]=buf[2]=0; - buf[3]=1; - if((len = so._recvfrom(param->remsock, buf+10, 65535 - 10, 0, (struct sockaddr *)&tsin, &sasize)) <= 0) { + buf[3]=(*SAFAMILY(¶m->sinsl) == AF_INET)?1:4; + if((len = so._recvfrom(param->remsock, buf+6+SAADDRLEN(¶m->sinsl), 65535 - 10, 0, (struct sockaddr *)¶m->sinsr, &sasize)) <= 0) { param->res = 468; break; } param->statssrv64+=len; param->nreads++; - memcpy(buf+4, &tsin.sin_addr.s_addr, 4); - memcpy(buf+8, &tsin.sin_port, 2); - sasize = sizeof(param->sins); - if(socksendto(param->clisock, (struct sockaddr *)&sin, buf, len + 10, conf.timeouts[SINGLEBYTE_L]*1000) <=0){ + memcpy(buf+4, SAADDR(¶m->sinsr), SAADDRLEN(¶m->sinsr)); + memcpy(buf+4+SAADDRLEN(¶m->sinsr), SAPORT(¶m->sinsr), 2); + sasize = sizeof(sin); + if(socksendto(param->clisock, (struct sockaddr *)&sin, buf, len + 6 + SAADDRLEN(¶m->sinsr), conf.timeouts[SINGLEBYTE_L]*1000) <=0){ param->res = 469; break; } #if SOCKSTRACE > 1 -fprintf(stderr, "UDP packet relayed to client from %s:%hu size %d\n", - inet_ntoa(tsin.sin_addr), - ntohs(tsin.sin_port), +fprintf(stderr, "UDP packet relayed to client from %hu size %d\n", + ntohs(*SAPORT(¶m->sinsr)), len ); fflush(stderr); @@ -415,7 +417,7 @@ fflush(stderr); } else myinet_ntop(*SAFAMILY(¶m->req), SAADDR(¶m->req), (char *)buf + strlen((char *)buf), 64); - sprintf((char *)buf+strlen((char *)buf), ":%hu", ntohs(param->req.sin_port)); + sprintf((char *)buf+strlen((char *)buf), ":%hu", ntohs(*SAPORT(¶m->req))); (*param->srv->logfunc)(param, buf); myfree(buf); } diff --git a/src/stringtable.c b/src/stringtable.c index 4a1a54f..be59b75 100644 --- a/src/stringtable.c +++ b/src/stringtable.c @@ -30,8 +30,9 @@ unsigned char * strings[] = { /* 16 */ (unsigned char *)"FTPPR", /* 17 */ (unsigned char *)"SMTPP", /* 18 */ (unsigned char *)"ICQPR", -/* 19 */ (unsigned char *)"MSNPR", -/* 20 */ (unsigned char *)"ZOMBIE", +/* 19 (unsigned char *)"MSNPR", */ +/* 19 */ (unsigned char *)"ZOMBIE", +/* 20 */ NULL, /* 21 */ NULL, /* 22 */ NULL, /* 23 */ NULL, diff --git a/src/structures.h b/src/structures.h index 5aa2ced..a6c6e9e 100644 --- a/src/structures.h +++ b/src/structures.h @@ -137,7 +137,9 @@ typedef enum { S_FTPPR, S_SMTPP, S_ICQPR, +/* S_MSNPR, +*/ S_ZOMBIE }PROXYSERVICE; @@ -352,6 +354,7 @@ struct srvparam { int silent; int transparent; int nfilters, nreqfilters, nhdrfilterscli, nhdrfilterssrv, npredatfilters, ndatfilterscli, ndatfilterssrv; + int family; unsigned bufsize; unsigned logdumpsrv, logdumpcli; #ifndef NOIPV6 @@ -438,26 +441,21 @@ struct clientparam { maxtrafin64, maxtrafout64; #ifndef NOIPV6 - struct sockaddr_in6 sincl, sincr; + struct sockaddr_in6 sincl, sincr, sinsl, sinsr, req; #else - struct sockaddr_in sincl, sincr; + struct sockaddr_in sincl, sincr, sinsl, sinsr, req; #endif - struct sockaddr_in sins, - req; uint64_t statscli64, statssrv64; unsigned long nreads, nwrites, - nconnects, - extip; + nconnects; struct bandlim *bandlims[MAXBANDLIMS], *bandlimsout[MAXBANDLIMS]; - unsigned short extport; - time_t time_start; }; @@ -485,10 +483,11 @@ struct extparam { #ifndef NOIPV6 struct sockaddr_in6 intsa; struct sockaddr_in6 extsa6; + struct sockaddr_in extsa; #else struct sockaddr_in intsa; -#endif struct sockaddr_in extsa; +#endif struct passwords *pwl; struct auth * authenticate; AUTHFUNC authfunc; diff --git a/src/udppm.c b/src/udppm.c index e746540..4a609fb 100644 --- a/src/udppm.c +++ b/src/udppm.c @@ -40,7 +40,7 @@ void * udppmchild(struct clientparam* param) { if(!param->hostname)parsehostname((char *)param->srv->target, param, ntohs(param->srv->targetport)); - if (!param->req.sin_addr.s_addr) { + if (!memcmp(SAADDR(¶m->req), "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", SAADDRLEN(¶m->req))) { param->srv->fds.events = POLLIN; RETURN (100); } @@ -62,27 +62,25 @@ void * udppmchild(struct clientparam* param) { } if(so._setsockopt(param->clisock, SOL_SOCKET, SO_REUSEADDR, (unsigned char *)&ul, sizeof(int))) {RETURN(820);}; ioctlsocket(param->clisock, FIONBIO, &ul); - size = sizeof(param->sins); - if(so._getsockname(param->srv->srvsock, (struct sockaddr *)¶m->sins, &size)) {RETURN(21);}; - if(so._bind(param->clisock,(struct sockaddr *)¶m->sins,sizeof(struct sockaddr_in))) { + size = sizeof(param->sinsl); + if(so._getsockname(param->srv->srvsock, (struct sockaddr *)¶m->sinsl, &size)) {RETURN(21);}; + if(so._bind(param->clisock,(struct sockaddr *)¶m->sinsl,sizeof(struct sockaddr_in))) { RETURN(822); } #else param->clisock = param->srv->srvsock; #endif - param->sins.sin_family = AF_INET; - param->sins.sin_port = htons(0); - param->sins.sin_addr.s_addr = param->extip; - if ((param->remsock=so._socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {RETURN (11);} - if(so._bind(param->remsock,(struct sockaddr *)¶m->sins,sizeof(param->sins))) {RETURN (12);} + memcpy(¶m->sinsl, *SAFAMILY(¶m->req) == AF_INET? (struct sockaddr *)¶m->srv->extsa : (struct sockaddr *)¶m->srv->extsa6, SASIZE(¶m->req)); + *SAPORT(¶m->sinsl) = 0; + if ((param->remsock=so._socket(*SAFAMILY(¶m->sinsl), SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {RETURN (11);} + if(so._bind(param->remsock,(struct sockaddr *)¶m->sinsl,sizeof(param->sinsl))) {RETURN (12);} #ifdef _WIN32 ioctlsocket(param->remsock, FIONBIO, &ul); #else fcntl(param->remsock,F_SETFL,O_NONBLOCK); #endif - param->sins.sin_addr.s_addr = param->req.sin_addr.s_addr; - param->sins.sin_port = param->req.sin_port; + memcpy(¶m->sinsr, ¶m->req, sizeof(param->req)); param->operation = UDPASSOC; if((res = (*param->srv->authfunc)(param))) {RETURN(res);} diff --git a/src/version.h b/src/version.h index 15a8005..030dff4 100644 --- a/src/version.h +++ b/src/version.h @@ -1,2 +1,2 @@ #define VERSION "3proxy-0.8b-devel" -#define BUILDDATE "141019042604" +#define BUILDDATE "141019215116"