From dc7e098e6b5563e1f31bdd1ad165a64f4983fd3c Mon Sep 17 00:00:00 2001 From: Vladimir Dubrovin <3proxy@3proxy.ru> Date: Wed, 12 Jul 2023 15:55:50 +0300 Subject: [PATCH] Support request filters for SOCKS, support broken BIND request from some clients --- src/socks.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/socks.c b/src/socks.c index 9f61293..9a8f4c9 100644 --- a/src/socks.c +++ b/src/socks.c @@ -132,7 +132,8 @@ void * sockschild(struct clientparam* param) { buf[i] = (unsigned char)res; } buf[i] = 0; - if(!getip46(param->srv->family, buf, (struct sockaddr *) ¶m->req)) RETURN(100); + if(command != 1 && param->srv->family != 6 && (!strcmp((char *)buf, "0.0.0.0") || !strcmp((char *)buf, "0"))) param->req = param->srv->extsa; + else if(!getip46(param->srv->family, buf, (struct sockaddr *) ¶m->req)) RETURN(100); param->sinsr = param->req; break; default: @@ -203,7 +204,24 @@ void * sockschild(struct clientparam* param) { RETURN(res); } - +#ifndef WITHMAIN + if(param->nreqfilters && buf){ + int reqbufsize = BUFSIZE, reqsize, action; + sprintf((char *)buf, "%s ", commands[command]); + if(param->hostname){ + sprintf((char *)buf + strlen((char *)buf), "%.265s", param->hostname); + } + else + myinet_ntop(*SAFAMILY(¶m->req), SAADDR(¶m->req), (char *)buf + strlen((char *)buf), 64); + sprintf((char *)buf+strlen((char *)buf), ":%hu", ntohs(*SAPORT(¶m->req))); + reqsize = strlen((char *)buf); + action = handlereqfilters(param, &buf, &reqbufsize, 0, &reqsize); + if(action == HANDLED){ + RETURN(0); + } + if(action != PASS) RETURN(517); + } +#endif if(command > 1) { if(so._bind(param->remsock,(struct sockaddr *)¶m->sinsl,SASIZE(¶m->sinsl))) { @@ -233,6 +251,11 @@ fflush(stderr); } param->res = 0; + + + + + CLEANRET: if(param->clisock != INVALID_SOCKET){ @@ -274,6 +297,8 @@ fflush(stderr); socksend(param->clisock, buf, 8, conf.timeouts[STRING_S]); } + + if (param->npredatfilters){ int action;