From 0e13f571396e36d2858a7872fcf18a8e7dcfe517 Mon Sep 17 00:00:00 2001 From: Vladimir Dubrovin <3proxy@3proxy.ru> Date: Wed, 6 May 2026 22:44:29 +0300 Subject: [PATCH] Allocate udp buffer dynamically --- src/conf.c | 6 +++--- src/proxymain.c | 16 ++++++++++++++-- src/structures.h | 6 ++---- src/udppm.c | 1 - src/udpsockmap.c | 2 ++ 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/conf.c b/src/conf.c index fa0b626..c5b6833 100644 --- a/src/conf.c +++ b/src/conf.c @@ -163,14 +163,14 @@ int start_proxy_thread(struct child * chp){ _3proxy_sem_lock(conf.threadinit); #ifdef _WIN32 #ifndef _WINCE - h = (HANDLE)_beginthreadex((LPSECURITY_ATTRIBUTES )NULL, 32768+conf.stacksize, (void *)startsrv, (void *) chp, (DWORD)0, &thread); + h = (HANDLE)_beginthreadex((LPSECURITY_ATTRIBUTES )NULL, 16384+conf.stacksize, (void *)startsrv, (void *) chp, (DWORD)0, &thread); #else - h = (HANDLE)CreateThread((LPSECURITY_ATTRIBUTES )NULL, 32768+conf.stacksize, (void *)startsrv, (void *) chp, (DWORD)0, &thread); + h = (HANDLE)CreateThread((LPSECURITY_ATTRIBUTES )NULL, 16384+conf.stacksize, (void *)startsrv, (void *) chp, (DWORD)0, &thread); #endif if(h)CloseHandle(h); #else pthread_attr_init(&pa); - pthread_attr_setstacksize(&pa,PTHREAD_STACK_MIN + (65536+conf.stacksize)); + pthread_attr_setstacksize(&pa,PTHREAD_STACK_MIN + (32768+conf.stacksize)); pthread_attr_setdetachstate(&pa,PTHREAD_CREATE_DETACHED); pthread_create(&thread, &pa, startsrv, (void *)chp); pthread_attr_destroy(&pa); diff --git a/src/proxymain.c b/src/proxymain.c index f6bf665..823d211 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -349,6 +349,14 @@ int MODULEMAINFUNC (int argc, char** argv){ #ifndef NOUDPMAIN if(isudp) { if(!udp_table.ihashtable)inithashtable(&udp_table, 64, 256, 65536); + srv.udpbuf = malloc(UDPBUFSIZE); + srv.udpbuf2 = malloc(UDPBUFSIZE); + if(!srv.udpbuf || !srv.udpbuf2) { +#ifndef STDMAIN + haveerror = 2; +#endif + return 11; + } } #endif srv.service = defparam.service = childdef.service; @@ -995,8 +1003,8 @@ int MODULEMAINFUNC (int argc, char** argv){ if(hashresolv(&udp_table, &defparam, &toparam, NULL)) { int i, len=0; - if(toparam->udp_nhops - 1){ - for(i=1; i < toparam->udp_nhops - 1; i++){ + if(toparam->udp_nhops){ + for(i=1; i < toparam->udp_nhops; i++){ len+=socks5_udp_build_hdr(srv.udpbuf2+len, &toparam->udp_relay[i-1]); } len += socks5_udp_build_hdr(srv.udpbuf2+len, &toparam->req); @@ -1241,6 +1249,10 @@ void srvfree(struct srvparam * srv){ if(srv->onetns) free(srv->onetns); #endif if(srv->so.freefunc) srv->so.freefunc(srv->so.state); +#ifndef NOUDPMAIN + if(srv->udpbuf) free(srv->udpbuf); + if(srv->udpbuf2) free(srv->udpbuf2); +#endif } diff --git a/src/structures.h b/src/structures.h index d4131e4..ae81ad0 100644 --- a/src/structures.h +++ b/src/structures.h @@ -569,11 +569,9 @@ struct srvparam { uint16_t targetport; unsigned char replace; time_t time_start; -#ifndef NOUDPMAIN - unsigned char udpbuf[UDPBUFSIZE]; - unsigned char udpbuf2[UDPBUFSIZE]; + unsigned char *udpbuf; + unsigned char *udpbuf2; int udplen; -#endif }; struct clientparam { diff --git a/src/udppm.c b/src/udppm.c index c4c04ce..315e9d7 100644 --- a/src/udppm.c +++ b/src/udppm.c @@ -75,7 +75,6 @@ void * udppmchild(struct clientparam* param) { param->srvinbuf = 0; param->nwrites++; param->clisock = param->srv->srvsock; - param->udp_nhops++; param->waitserver64 = 0x7fffffffffffffff; param->res = udpsockmap(param, conf.timeouts[STRING_L]); _3proxy_sem_lock(udpinit); diff --git a/src/udpsockmap.c b/src/udpsockmap.c index 7ee1ccf..97055bb 100644 --- a/src/udpsockmap.c +++ b/src/udpsockmap.c @@ -57,6 +57,8 @@ int udpsockmap(struct clientparam *param, int timeo) int nhops = param->udp_nhops; int clisock_idx = -1, ctrlsock_idx = -1, ctrlsocksrv_idx = -1; int firstpacket = 1; + + if(param->srv->service == S_UDPPM) nhops++; if (param->srvbufsize < UDPBUFSIZE) { unsigned char *newbuf = realloc(param->srvbuf, UDPBUFSIZE); if (!newbuf) return 21;