Просмотр исходного кода

initial partial patches for IPv6 client support

z3APA3A 11 лет назад
Родитель
Сommit
c7310a2060
18 измененных файлов с 134 добавлено и 143 удалено
  1. 2 0
      src/3proxy.c
  2. 3 12
      src/Makefile.inc
  3. 2 0
      src/auth.c
  4. 4 0
      src/common.c
  5. 1 1
      src/ftppr.c
  6. 1 1
      src/icqpr.c
  7. 8 6
      src/plugins.c
  8. 1 1
      src/pop3p.c
  9. 0 13
      src/proxy.c
  10. 8 5
      src/proxymain.c
  11. 5 5
      src/smtpp.c
  12. 2 2
      src/sockgetchar.c
  13. 2 2
      src/sockmap.c
  14. 74 72
      src/socks.c
  15. 3 2
      src/stringtable.c
  16. 8 9
      src/structures.h
  17. 9 11
      src/udppm.c
  18. 1 1
      src/version.h

+ 2 - 0
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;

+ 3 - 12
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)

+ 2 - 0
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;
 				}

+ 4 - 0
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(&param->sincr) == *SAFAMILY(&param->req) && !memcmp(SAADDR(&param->sincr), SAADDR(&param->req), SASIZE(param->req)) &&
+	*SAPORT(&param->sincr) == *SAPORT(&param->req)) return 519;
+
  if (param->operation == ADMIN || param->operation == DNSRESOLVE || param->operation == BIND || param->operation == UDPASSOC)
 	return 0;
  if (param->remsock != INVALID_SOCKET){

+ 1 - 1
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(&param->sinsr))==21)?0:':', ntohs(*SAPORT(&param->sinsr)));
 		req = mystrdup((char *)buf);
 #ifndef WITHMAIN
 		{

+ 1 - 1
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 *)&param->sins, *buf_p + *length_p, increment, conf.timeouts[STRING_S]*1000);
+	if(increment) len = sockrecvfrom(param->remsock, (struct sockaddr *)&param->sinsr, *buf_p + *length_p, increment, conf.timeouts[STRING_S]*1000);
 	if(len > 0) {
 		*length_p += len;
 		param->nreads++;

+ 8 - 6
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}
 };
 

+ 1 - 1
src/pop3p.c

@@ -49,7 +49,7 @@ void * pop3pchild(struct clientparam* param) {
 CLEANRET:
 
  if(param->hostname&&param->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(&param->sinsr)==110)?0:':', ntohs(*SAPORT(&param->sinsr)));
 	 (*param->srv->logfunc)(param, buf);
  }
  else (*param->srv->logfunc)(param, NULL);

+ 0 - 13
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(&param->srv->intsa) == AF_INET &&
-	(param->sins.sin_addr.s_addr == ((struct sockaddr_in *)&param->srv->intsa)->sin_addr.s_addr && param->sins.sin_port == *SAPORT(&param->srv->intsa))) {
-	RETURN(519);
- }
- sasize = sizeof(struct sockaddr_in);
- if(so._getpeername(param->remsock, (struct sockaddr *)&param->sins, &sasize)){
-	RETURN(520);
- }
 #define FTPBUFSIZE 1536
 
  if(ftp && param->redirtype != R_HTTP){

+ 8 - 5
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(&param->req) = *SAFAMILY(&param->sins) = *SAFAMILY(&param->sincr) = *SAFAMILY(&param->sincl) = AF_INET;
+ *SAFAMILY(&param->req) = *SAFAMILY(&param->sinsl) = *SAFAMILY(&param->sinsr) = *SAFAMILY(&param->sincr) = *SAFAMILY(&param->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(&param->sincr, &srv->intsa, sizeof(param->sincr));
-/* FIX ME */
- memcpy(&param->sins, &srv->extsa, sizeof(param->sins));
+ memcpy(&param->sinsl, &srv->extsa, sizeof(param->sinsl));
 }
 
 void srvfree(struct srvparam * srv){

+ 5 - 5
src/smtpp.c

@@ -83,7 +83,7 @@ int readdata (struct clientparam* param) {
 		return -1;
 	}
 #endif
-	socksendto(param->remsock, (struct sockaddr *)&param->sins, buf, i, conf.timeouts[STRING_S]);	
+	socksendto(param->remsock, (struct sockaddr *)&param->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(&param->sinsl), SAADDR(&param->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&&param->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(&param->sinsr))==25)?0:':', *SAPORT(&param->sinsr));
 	 (*param->srv->logfunc)(param, buf);
  }
  else (*param->srv->logfunc)(param, NULL);

+ 2 - 2
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 *)&param->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 *)&param->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 *)&param->sins, param->srvbuf, param->srvbufsize, timeosec*1000 + timeousec))<=0) return EOF;
+	if ((len = sockrecvfrom(param->remsock, (struct sockaddr *)&param->sinsr, param->srvbuf, param->srvbufsize, timeosec*1000 + timeousec))<=0) return EOF;
 	param->srvinbuf = len;
 	param->srvoffset = 1;
 	param->nreads++;

+ 2 - 2
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*)&param->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*)&param->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 *)&param->sins, param->clibuf + param->clioffset, param->cliinbuf - param->clioffset, conf.timeouts[STRING_S] * 1000);
+	res = socksendto(param->remsock, (struct sockaddr *)&param->sinsr, param->clibuf + param->clioffset, param->cliinbuf - param->clioffset, conf.timeouts[STRING_S] * 1000);
 	if(res > 0){
 		param->clioffset += res;
 		param->statscli64 += res;

+ 74 - 72
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; i<size; i++){
 			if ((res = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(441);}
 			buf[i] = (unsigned char)res;
 		}
-		param->sins.sin_addr.s_addr = param->req.sin_addr.s_addr = *(unsigned long *)buf;
-		if(command==1 && !param->req.sin_addr.s_addr) {
+		*SAFAMILY(&param->sinsr) = *SAFAMILY(&param->req) = (c == 1)? AF_INET:AF_INET6;
+		memcpy(SAADDR(&param->sinsr), buf, size);
+		memcpy(SAADDR(&param->req), buf, size);
+		if(command==1 && !memcmp(SAADDR(&param->req), "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", size)) {
 			RETURN(421);
 		}
-		myinet_ntop(*SAFAMILY(&param->sins), SAADDR(&param->sins), (char *)buf, 64);
+		myinet_ntop(*SAFAMILY(&param->sinsr), SAADDR(&param->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 *) &param->req)) RETURN(100);
+		memcpy(&param->sinsr, &param->req, sizeof(&param->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(&param->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 *) &param->req)) RETURN(100);
+		memcpy(&param->sinsr, &param->req, sizeof(&param->req));
 	}
  }
- if(command == 1 && !param->req.sin_port) {RETURN(421);}
- param->sins.sin_family = AF_INET;
+
+ *SAPORT(&param->sinsr) = *SAPORT(&param->req) = port;
+ if(command == 1 && !*SAPORT(&param->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(&param->sinsl, *SAFAMILY(&param->req)==AF_INET6? (struct sockaddr *)&param->srv->extsa6:(struct sockaddr *)&param->srv->extsa, SASIZE(&param->req)); 
+	 if(!*SAPORT(&param->sinsl))*SAPORT(&param->sinsl) = port;
+	 if ((param->remsock=so._socket(*SAFAMILY(&param->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 *)&param->sins,sizeof(param->sins))) {
-		param->sins.sin_port = 0;
-		if(so._bind(param->remsock,(struct sockaddr *)&param->sins,sizeof(param->sins)))RETURN (12);
+	if(so._bind(param->remsock,(struct sockaddr *)&param->sinsl,SASIZE(&param->sinsl))) {
+		*SAPORT(&param->sinsl) = 0;
+		if(so._bind(param->remsock,(struct sockaddr *)&param->sinsl,SASIZE(&param->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(&param->sins));
 fflush(stderr);
 #endif
 	}
-	sasize = sizeof(param->sins);
-	so._getsockname(param->remsock, (struct sockaddr *)&param->sins,  &sasize);
+	sasize = SASIZE(&param->sinsl);
+	so._getsockname(param->remsock, (struct sockaddr *)&param->sinsl,  &sasize);
 	if(command == 3) {
 		param->ctrlsock = param->clisock;
 		param->clisock = so._socket(SASOCK(&param->sincr), SOCK_DGRAM, IPPROTO_UDP);
 		if(param->clisock == INVALID_SOCKET) {RETURN(11);}
 		memcpy(&sin, &param->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 *)&param->sins, &sasize);
+				sasize = sizeof(param->sinsr);
+				s = so._accept(param->remsock, (struct sockaddr *)&param->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(&param->req),"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",SAADDRLEN(&param->req)) &&
+				 memcmp(SAADDR(&param->req),SAADDR(&param->sinsr),SAADDRLEN(&param->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, &param->sins.sin_addr, 4);
-					memcpy (buf+8, &param->sins.sin_port, 2);
-					socksend(param->clisock, buf, 10, conf.timeouts[STRING_S]);
+					buf[3] = (*SAFAMILY(&param->sinsr) == AF_INET)?1:4;
+					memcpy(buf+4, SAADDR(&param->sinsr), SAADDRLEN(&param->sinsr));
+					memcpy(buf+4+SAADDRLEN(&param->sinsr), SAPORT(&param->sinsr), 2);
+					socksend(param->clisock, buf, 6+SAADDRLEN(&param->sinsr), conf.timeouts[STRING_S]);
 				}
 				else {
-					memcpy (buf+2, &param->sins.sin_port, 2);
-					memcpy (buf+4, &param->sins.sin_addr, 4);
+					memcpy (buf+2, SAPORT(&param->sinsr), 2);
+					memcpy (buf+4, SAADDR(&param->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(&param->sinsr, &param->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(&param->sins.sin_addr.s_addr, buf+4, 4);
+								i = 4+size;
+								memcpy(SAADDR(&param->sinsr), buf+4, size);
+								*SAFAMILY(&param->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 *) &param->sinsr)) RETURN(100);
 								break;
 							default:
 								RETURN(997);
 						 }
 
-						memcpy(&param->sins.sin_port, buf+i, 2);
+						memcpy(SAPORT(&param->sinsr), buf+i, 2);
 						i+=2;
 
-						sasize = sizeof(param->sins);
+						sasize = sizeof(param->sinsr);
 						if(len > (int)i){
-							if(socksendto(param->remsock, (struct sockaddr *)&param->sins, buf+i, len - i, conf.timeouts[SINGLEBYTE_L]*1000) <= 0){
+							if(socksendto(param->remsock, (struct sockaddr *)&param->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(&param->sinsl) == AF_INET)?1:4;
+						if((len = so._recvfrom(param->remsock, buf+6+SAADDRLEN(&param->sinsl), 65535 - 10, 0, (struct sockaddr *)&param->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(&param->sinsr), SAADDRLEN(&param->sinsr));
+						memcpy(buf+4+SAADDRLEN(&param->sinsr), SAPORT(&param->sinsr), 2);
+						sasize = sizeof(sin);
+						if(socksendto(param->clisock, (struct sockaddr *)&sin, buf, len + 6 + SAADDRLEN(&param->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(&param->sinsr)),
 			len
 	);
 fflush(stderr);
@@ -415,7 +417,7 @@ fflush(stderr);
 	 }
 	 else 
 		myinet_ntop(*SAFAMILY(&param->req), SAADDR(&param->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(&param->req)));
 	 (*param->srv->logfunc)(param, buf);
 	 myfree(buf);
  }

+ 3 - 2
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,

+ 8 - 9
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;

+ 9 - 11
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(&param->req), "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", SAADDRLEN(&param->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 *)&param->sins, &size)) {RETURN(21);};
-	if(so._bind(param->clisock,(struct sockaddr *)&param->sins,sizeof(struct sockaddr_in))) {
+	size = sizeof(param->sinsl);
+	if(so._getsockname(param->srv->srvsock, (struct sockaddr *)&param->sinsl, &size)) {RETURN(21);};
+	if(so._bind(param->clisock,(struct sockaddr *)&param->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 *)&param->sins,sizeof(param->sins))) {RETURN (12);}
+ memcpy(&param->sinsl, *SAFAMILY(&param->req) == AF_INET? (struct sockaddr *)&param->srv->extsa : (struct sockaddr *)&param->srv->extsa6, SASIZE(&param->req));
+ *SAPORT(&param->sinsl) = 0;
+ if ((param->remsock=so._socket(*SAFAMILY(&param->sinsl), SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {RETURN (11);}
+ if(so._bind(param->remsock,(struct sockaddr *)&param->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(&param->sinsr, &param->req, sizeof(param->req));
 
  param->operation = UDPASSOC;
  if((res = (*param->srv->authfunc)(param))) {RETURN(res);}

+ 1 - 1
src/version.h

@@ -1,2 +1,2 @@
 #define VERSION "3proxy-0.8b-devel"
-#define BUILDDATE "141019042604"
+#define BUILDDATE "141019215116"