Fix: invalid error in ssl server handshake can lead to broken service state

This commit is contained in:
Vladimir Dubrovin 2026-06-28 21:10:45 +03:00
parent 8f13582329
commit e41ab58b2c

View File

@ -18,6 +18,19 @@ DWORD WINAPI threadfunc(LPVOID p) {
void * threadfunc (void *p) { void * threadfunc (void *p) {
#endif #endif
int i = -1; int i = -1;
#ifndef STDMAIN
if(makefilters(param->srv, param) > CONTINUE){
#ifndef NOUDPMAIN
if(param->srv->service == S_UDPPM) _3proxy_sem_unlock(udpinit);
#endif
freeparam(param);
#ifdef _WIN32
return 0;
#else
return NULL;
#endif
}
#endif
if(param->srv->cbsock != INVALID_SOCKET){ if(param->srv->cbsock != INVALID_SOCKET){
SASIZETYPE size = sizeof(param->sinsr); SASIZETYPE size = sizeof(param->sinsr);
struct pollfd fds; struct pollfd fds;
@ -1054,17 +1067,6 @@ int MODULEMAINFUNC (int argc, char** argv){
if(defparam.hostname)newparam->hostname=(unsigned char *)strdup((char *)defparam.hostname); if(defparam.hostname)newparam->hostname=(unsigned char *)strdup((char *)defparam.hostname);
clearstat(newparam); clearstat(newparam);
if(!isudp) newparam->clisock = new_sock; if(!isudp) newparam->clisock = new_sock;
#ifndef STDMAIN
if(makefilters(&srv, newparam) > CONTINUE){
freeparam(newparam);
#ifndef NOUDPMAIN
if(isudp) {
_3proxy_sem_unlock(udpinit);
}
#endif
continue;
}
#endif
newparam->prev = newparam->next = NULL; newparam->prev = newparam->next = NULL;
error = 0; error = 0;
_3proxy_mutex_lock(&srv.counter_mutex); _3proxy_mutex_lock(&srv.counter_mutex);
@ -1099,6 +1101,11 @@ int MODULEMAINFUNC (int argc, char** argv){
if(newparam->prev) newparam->prev->next = newparam->next; if(newparam->prev) newparam->prev->next = newparam->next;
else srv.child = newparam->next; else srv.child = newparam->next;
if(newparam->next) newparam->next->prev = newparam->prev; if(newparam->next) newparam->next->prev = newparam->prev;
if(newparam->clisock != INVALID_SOCKET){
srv.so._shutdown(srv.so.state, newparam->clisock, SHUT_RDWR);
srv.so._closesocket(srv.so.state, newparam->clisock);
newparam->clisock = INVALID_SOCKET;
}
newparam->srv = NULL; newparam->srv = NULL;
#ifndef NOUDPMAIN #ifndef NOUDPMAIN
if(isudp){ if(isudp){
@ -1289,15 +1296,17 @@ void freeparam(struct clientparam * param) {
#ifndef STDMAIN #ifndef STDMAIN
if(param->srv->service == S_UDPPM) hashdelete(&udp_table, param); if(param->srv->service == S_UDPPM) hashdelete(&udp_table, param);
#endif #endif
if(param->prev){ if(param->prev || param->next || param->srv->child == param){
param->prev->next = param->next; if(param->prev){
param->prev->next = param->next;
}
else
param->srv->child = param->next;
if(param->next){
param->next->prev = param->prev;
}
(param->srv->childcount)--;
} }
else
param->srv->child = param->next;
if(param->next){
param->next->prev = param->prev;
}
(param->srv->childcount)--;
_3proxy_mutex_unlock(&param->srv->counter_mutex); _3proxy_mutex_unlock(&param->srv->counter_mutex);
} }
if(param->clibuf) free(param->clibuf); if(param->clibuf) free(param->clibuf);