diff --git a/src/redirect.c b/src/redirect.c index 68c7096..e64b1e7 100644 --- a/src/redirect.c +++ b/src/redirect.c @@ -236,11 +236,13 @@ int clientnegotiate(struct chain * redir, struct clientparam * param, struct soc ((struct sockaddr_in *)relay)->sin_family = AF_INET; memcpy(&((struct sockaddr_in *)relay)->sin_addr, buf, 4); memcpy(&((struct sockaddr_in *)relay)->sin_port, buf + 4, 2); + if (param->udp_nhops == 0) param->sinsr = *relay; param->udp_nhops++; } else if (atyp == 4) { ((struct sockaddr_in6 *)relay)->sin6_family = AF_INET6; memcpy(&((struct sockaddr_in6 *)relay)->sin6_addr, buf, 16); memcpy(&((struct sockaddr_in6 *)relay)->sin6_port, buf + 16, 2); + if (param->udp_nhops == 0) param->sinsr = *relay; param->udp_nhops++; } } @@ -267,7 +269,7 @@ int handleredirect(struct clientparam * param, struct ace * acentry){ if(param->remsock != INVALID_SOCKET) { return 0; } - if(SAISNULL(¶m->req) || !*SAPORT(¶m->req)) { + if((SAISNULL(¶m->req) || !*SAPORT(¶m->req)) && param->operation != UDPASSOC) { return 100; } diff --git a/src/socks.c b/src/socks.c index c39e65c..d0624a0 100644 --- a/src/socks.c +++ b/src/socks.c @@ -143,7 +143,7 @@ void * sockschild(struct clientparam* param) { buf[i] = (unsigned char)res; } buf[i] = 0; - if(command != 1 && param->srv->family != 6 && (!strcmp((char *)buf, "0.0.0.0") || !strcmp((char *)buf, "0"))) param->req = param->srv->extsa; + if(command == 2 && 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; diff --git a/src/udpsockmap.c b/src/udpsockmap.c index 2bd2314..9cf9afe 100644 --- a/src/udpsockmap.c +++ b/src/udpsockmap.c @@ -176,11 +176,20 @@ int udpsockmap(struct clientparam *param, int timeo) (char *)param->srvbuf + hdrsize, UDPBUFSIZE - hdrsize, 0, (struct sockaddr *)&from, &sasize); if (len <= 0) return 468; - if (!SAISNULL(¶m->sinsr) && *SAPORT(¶m->sinsr)) { - if (SAADDRLEN(&from) != SAADDRLEN(¶m->sinsr) || - memcmp(SAADDR(&from), SAADDR(¶m->sinsr), SAADDRLEN(&from)) || - memcmp(SAPORT(&from), SAPORT(¶m->sinsr), 2)) - continue; + if (nhops >= 1) { + if (!SAISNULL(¶m->sinsr) && *SAPORT(¶m->sinsr)) { + if (SAADDRLEN(&from) != SAADDRLEN(¶m->sinsr) || + memcmp(SAADDR(&from), SAADDR(¶m->sinsr), SAADDRLEN(&from)) || + memcmp(SAPORT(&from), SAPORT(¶m->sinsr), 2)) + continue; + } + } else { + if (!SAISNULL(¶m->req) && *SAPORT(¶m->req)) { + if (SAADDRLEN(&from) != SAADDRLEN(¶m->req) || + memcmp(SAADDR(&from), SAADDR(¶m->req), SAADDRLEN(&from)) || + memcmp(SAPORT(&from), SAPORT(¶m->req), 2)) + continue; + } } param->statssrv64 += len; param->nreads++;