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;
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(&param->req) || !*SAPORT(&param->req)) {
if((SAISNULL(&param->req) || !*SAPORT(&param->req)) && param->operation != UDPASSOC) {
return 100;
}

View File

@ -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 *) &param->req)) RETURN(100);
param->sinsr = param->req;
break;

View File

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