From c42529c3f877cb0bd830e0b6ccb5a6758dfacc46 Mon Sep 17 00:00:00 2001 From: dscho Date: Mon, 16 May 2005 16:18:59 +0000 Subject: [PATCH] fix SIGSEGV when client has incompatible protocol; release mutex before freeing it --- libvncserver/rfbserver.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libvncserver/rfbserver.c b/libvncserver/rfbserver.c index fceb02c..22bdc98 100644 --- a/libvncserver/rfbserver.c +++ b/libvncserver/rfbserver.c @@ -235,6 +235,9 @@ rfbNewTCPOrUDPClient(rfbScreenInfoPtr rfbScreen, rfbResetStats(cl); + cl->clientData = NULL; + cl->clientGoneHook = rfbDoNothingWithClient; + if(isUDP) { rfbLog(" accepted UDP client\n"); } else { @@ -353,8 +356,6 @@ rfbNewTCPOrUDPClient(rfbScreenInfoPtr rfbScreen, } } - cl->clientData = NULL; - cl->clientGoneHook = rfbDoNothingWithClient; switch (cl->screen->newClientHook(cl)) { case RFB_CLIENT_ON_HOLD: cl->onHold = TRUE; @@ -458,7 +459,9 @@ rfbClientConnectionGone(rfbClientPtr cl) TINI_COND(cl->updateCond); TINI_MUTEX(cl->updateMutex); + /* make sure outputMutex is unlocked before destroying */ LOCK(cl->outputMutex); + UNLOCK(cl->outputMutex); TINI_MUTEX(cl->outputMutex); #ifdef CORBA