|
@@ -33,6 +33,7 @@ void * sockschild(struct clientparam* param) {
|
|
|
struct sockaddr_in sin = {AF_INET};
|
|
struct sockaddr_in sin = {AF_INET};
|
|
|
#endif
|
|
#endif
|
|
|
int len;
|
|
int len;
|
|
|
|
|
+ int heur = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
param->service = S_SOCKS;
|
|
param->service = S_SOCKS;
|
|
@@ -123,6 +124,15 @@ void * sockschild(struct clientparam* param) {
|
|
|
RETURN(431);
|
|
RETURN(431);
|
|
|
}
|
|
}
|
|
|
myinet_ntop(*SAFAMILY(¶m->sinsr), SAADDR(¶m->sinsr), buf, 64);
|
|
myinet_ntop(*SAFAMILY(¶m->sinsr), SAADDR(¶m->sinsr), buf, 64);
|
|
|
|
|
+ if(command == 3){
|
|
|
|
|
+ if(*SAFAMILY(¶m->req) == *SAFAMILY(¶m->sincr) && !memcmp(SAADDR(¶m->req),SAADDR(¶m->sincr), SAADDRLEN(¶m->req))){
|
|
|
|
|
+ heur = 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (!SAISNULL(¶m->req)){
|
|
|
|
|
+ heur = 2;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
break;
|
|
break;
|
|
|
case 3:
|
|
case 3:
|
|
|
if ((size = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(451);} /* nmethods */
|
|
if ((size = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(451);} /* nmethods */
|
|
@@ -330,7 +340,7 @@ fflush(stderr);
|
|
|
param->sinsr = param->req;
|
|
param->sinsr = param->req;
|
|
|
myfree(buf);
|
|
myfree(buf);
|
|
|
if(!(buf = myalloc(LARGEBUFSIZE))) {RETURN(21);}
|
|
if(!(buf = myalloc(LARGEBUFSIZE))) {RETURN(21);}
|
|
|
- sin = param->sincr;
|
|
|
|
|
|
|
+ sin = (heur == 1)?param->req:param->sincr;
|
|
|
|
|
|
|
|
fds[2].events = fds[1].events = fds[0].events = 0;
|
|
fds[2].events = fds[1].events = fds[0].events = 0;
|
|
|
fds[0].fd = param->remsock;
|
|
fds[0].fd = param->remsock;
|
|
@@ -346,11 +356,20 @@ fflush(stderr);
|
|
|
if(len < 10) continue;
|
|
if(len < 10) continue;
|
|
|
|
|
|
|
|
sasize = sizeof(sin);
|
|
sasize = sizeof(sin);
|
|
|
- if((len = so._recvfrom(param->clisock, (char *)buf, 65535, 0, (struct sockaddr *)&sin, &sasize)) <= 10) {
|
|
|
|
|
|
|
+ if(len <= 10) {
|
|
|
param->res = 464;
|
|
param->res = 464;
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
- if(SAADDRLEN(&sin) != SAADDRLEN(¶m->sincr) || memcmp(SAADDR(&sin), SAADDR(¶m->sincr), SAADDRLEN(&sin))){
|
|
|
|
|
|
|
+ if(SAADDRLEN(&sin) != SAADDRLEN(¶m->sincr) || memcmp(SAADDR(&sin), SAADDR(¶m->sincr), SAADDRLEN(&sin)) || (heur == 1 && *SAPORT(¶m->sincr)!=*SAPORT(&sin))){
|
|
|
|
|
+ if(heur == 1){
|
|
|
|
|
+#if SOCKSTRACE > 0
|
|
|
|
|
+fprintf(stderr, "internal UDP packet ignored\n");
|
|
|
|
|
+fflush(stderr);
|
|
|
|
|
+#endif
|
|
|
|
|
+ sin = param->req;
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
param->res = 465;
|
|
param->res = 465;
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
@@ -422,6 +441,13 @@ fflush(stderr);
|
|
|
fds[0].events = fds[0].revents = 0;
|
|
fds[0].events = fds[0].revents = 0;
|
|
|
param->statssrv64+=len;
|
|
param->statssrv64+=len;
|
|
|
param->nreads++;
|
|
param->nreads++;
|
|
|
|
|
+ if(heur == 2 && (*SAFAMILY(¶m->sinsr) != *SAFAMILY(¶m->req) || memcmp(SAADDR(¶m->sinsr),SAADDR(¶m->req), SAADDRLEN(¶m->req)))){
|
|
|
|
|
+#if SOCKSTRACE > 0
|
|
|
|
|
+fprintf(stderr, "external UDP packet ignored\n");
|
|
|
|
|
+fflush(stderr);
|
|
|
|
|
+#endif
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
memcpy(buf+4, SAADDR(¶m->sinsr), SAADDRLEN(¶m->sinsr));
|
|
memcpy(buf+4, SAADDR(¶m->sinsr), SAADDRLEN(¶m->sinsr));
|
|
|
memcpy(buf+4+SAADDRLEN(¶m->sinsr), SAPORT(¶m->sinsr), 2);
|
|
memcpy(buf+4+SAADDRLEN(¶m->sinsr), SAPORT(¶m->sinsr), 2);
|
|
|
sasize = sizeof(sin);
|
|
sasize = sizeof(sin);
|