From 984efe193bba4705fbe89b8342e41e5a6e1d403b Mon Sep 17 00:00:00 2001 From: z3APA3A <3APA3A@3proxy.ru> Date: Mon, 25 Sep 2017 17:14:13 +0300 Subject: [PATCH] Prevent deadlock on thread creation error --- src/proxymain.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/proxymain.c b/src/proxymain.c index e9d7e7c..9b9a323 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -774,6 +774,7 @@ int MODULEMAINFUNC (int argc, char** argv){ } #endif newparam->prev = newparam->next = NULL; + error = 0; pthread_mutex_lock(&srv.counter_mutex); if(!srv.child){ srv.child = newparam; @@ -796,7 +797,7 @@ int MODULEMAINFUNC (int argc, char** argv){ else { sprintf((char *)buf, "_beginthreadex(): %s", _strerror(NULL)); if(!srv.silent)(*srv.logfunc)(&defparam, buf); - freeparam(newparam); + error = 1; } #else @@ -805,13 +806,14 @@ int MODULEMAINFUNC (int argc, char** argv){ if(error){ sprintf((char *)buf, "pthread_create(): %s", strerror(error)); if(!srv.silent)(*srv.logfunc)(&defparam, buf); - freeparam(newparam); } else { newparam->threadid = (unsigned)thread; } #endif pthread_mutex_unlock(&srv.counter_mutex); + if(error) freeparam(newparam); + memset(&defparam.sincl, 0, sizeof(defparam.sincl)); memset(&defparam.sincr, 0, sizeof(defparam.sincr)); if(isudp) while(!srv.fds.events)usleep(SLEEPTIME);