Fix NULL address request for UDP ASSOC

This commit is contained in:
Vladimir Dubrovin 2026-05-01 17:26:06 +03:00
parent e986f8a747
commit acce67a512
3 changed files with 18 additions and 7 deletions

View File

@ -236,11 +236,13 @@ int clientnegotiate(struct chain * redir, struct clientparam * param, struct soc
((struct sockaddr_in *)relay)->sin_family = AF_INET; ((struct sockaddr_in *)relay)->sin_family = AF_INET;
memcpy(&((struct sockaddr_in *)relay)->sin_addr, buf, 4); memcpy(&((struct sockaddr_in *)relay)->sin_addr, buf, 4);
memcpy(&((struct sockaddr_in *)relay)->sin_port, buf + 4, 2); memcpy(&((struct sockaddr_in *)relay)->sin_port, buf + 4, 2);
if (param->udp_nhops == 0) param->sinsr = *relay;
param->udp_nhops++; param->udp_nhops++;
} else if (atyp == 4) { } else if (atyp == 4) {
((struct sockaddr_in6 *)relay)->sin6_family = AF_INET6; ((struct sockaddr_in6 *)relay)->sin6_family = AF_INET6;
memcpy(&((struct sockaddr_in6 *)relay)->sin6_addr, buf, 16); memcpy(&((struct sockaddr_in6 *)relay)->sin6_addr, buf, 16);
memcpy(&((struct sockaddr_in6 *)relay)->sin6_port, buf + 16, 2); memcpy(&((struct sockaddr_in6 *)relay)->sin6_port, buf + 16, 2);
if (param->udp_nhops == 0) param->sinsr = *relay;
param->udp_nhops++; param->udp_nhops++;
} }
} }
@ -267,7 +269,7 @@ int handleredirect(struct clientparam * param, struct ace * acentry){
if(param->remsock != INVALID_SOCKET) { if(param->remsock != INVALID_SOCKET) {
return 0; return 0;
} }
if(SAISNULL(&param->req) || !*SAPORT(&param->req)) { if((SAISNULL(&param->req) || !*SAPORT(&param->req)) && param->operation != UDPASSOC) {
return 100; return 100;
} }

View File

@ -143,7 +143,7 @@ void * sockschild(struct clientparam* param) {
buf[i] = (unsigned char)res; buf[i] = (unsigned char)res;
} }
buf[i] = 0; 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 *) &param->req)) RETURN(100); else if(!getip46(param->srv->family, buf, (struct sockaddr *) &param->req)) RETURN(100);
param->sinsr = param->req; param->sinsr = param->req;
break; break;

View File

@ -176,12 +176,21 @@ int udpsockmap(struct clientparam *param, int timeo)
(char *)param->srvbuf + hdrsize, UDPBUFSIZE - hdrsize, 0, (char *)param->srvbuf + hdrsize, UDPBUFSIZE - hdrsize, 0,
(struct sockaddr *)&from, &sasize); (struct sockaddr *)&from, &sasize);
if (len <= 0) return 468; if (len <= 0) return 468;
if (nhops >= 1) {
if (!SAISNULL(&param->sinsr) && *SAPORT(&param->sinsr)) { if (!SAISNULL(&param->sinsr) && *SAPORT(&param->sinsr)) {
if (SAADDRLEN(&from) != SAADDRLEN(&param->sinsr) || if (SAADDRLEN(&from) != SAADDRLEN(&param->sinsr) ||
memcmp(SAADDR(&from), SAADDR(&param->sinsr), SAADDRLEN(&from)) || memcmp(SAADDR(&from), SAADDR(&param->sinsr), SAADDRLEN(&from)) ||
memcmp(SAPORT(&from), SAPORT(&param->sinsr), 2)) memcmp(SAPORT(&from), SAPORT(&param->sinsr), 2))
continue; continue;
} }
} else {
if (!SAISNULL(&param->req) && *SAPORT(&param->req)) {
if (SAADDRLEN(&from) != SAADDRLEN(&param->req) ||
memcmp(SAADDR(&from), SAADDR(&param->req), SAADDRLEN(&from)) ||
memcmp(SAPORT(&from), SAPORT(&param->req), 2))
continue;
}
}
param->statssrv64 += len; param->statssrv64 += len;
param->nreads++; param->nreads++;
sendlen = len; sendlen = len;