mirror of
https://github.com/3proxy/3proxy.git
synced 2026-05-13 13:30:12 +08:00
Fix NULL address request for UDP ASSOC
This commit is contained in:
parent
e986f8a747
commit
acce67a512
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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++;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user