From 206c923d6cd433bd2e7196375442650c328b8bfa Mon Sep 17 00:00:00 2001 From: Vladimir Dubrovin <3proxy@3proxy.ru> Date: Mon, 12 Oct 2026 18:03:07 +0300 Subject: [PATCH] Fix SOCKS CONNECT and BIND replies reporting the client side address Without -Ne, the reply to CONNECT and BIND named the local address of the client's connection to the proxy instead of the socket towards the destination: the branch meant for UDP ASSOCIATE also took these. A BIND client was told the proxy's own port and the peer could never reach the listener. Introduced with -Ne / -Ni (0c8be90). Co-Authored-By: Claude Opus 5.5 --- src/socks.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/socks.c b/src/socks.c index c39ffab..fbbd80a 100644 --- a/src/socks.c +++ b/src/socks.c @@ -272,12 +272,17 @@ CLEANRET: int repcode; sasize = sizeof(sin); - if(command != 3 && param->remsock != INVALID_SOCKET) param->srv->so._getsockname(param->sostate, param->remsock, (struct sockaddr *)&sin, &sasize); - if(command != 3 && !SAISNULL(¶m->srv->extNat)){ - uint16_t port; - port = *SAPORT(&sin); - sin = param->srv->extNat; - *SAPORT(&sin) = port; + /* CONNECT and BIND report the address of the socket towards the + destination, UDP ASSOCIATE the one the client sends its datagrams + to, as does a request which never got a socket of its own */ + if(command != 3 && param->remsock != INVALID_SOCKET){ + param->srv->so._getsockname(param->sostate, param->remsock, (struct sockaddr *)&sin, &sasize); + if(!SAISNULL(¶m->srv->extNat)){ + uint16_t port; + port = *SAPORT(&sin); + sin = param->srv->extNat; + *SAPORT(&sin) = port; + } } else { param->srv->so._getsockname(param->sostate, param->clisock, (struct sockaddr *)&sin, &sasize);