From: Jiri Denemark Date: Fri, 2 Mar 2012 18:57:27 +0000 (+0100) Subject: rpc: Fix client crash on connection close X-Git-Tag: v0.9.11-rc1~161 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=720bee300896a0e66d47e391be7cd86719697075;p=thirdparty%2Flibvirt.git rpc: Fix client crash on connection close A multi-threaded client with event loop may crash if one of its threads closes a connection while event loop is in the middle of sending keep-alive message (either request or response). The right place for it is inside virNetClientIOEventLoop() between poll() and virNetClientLock(). We should only close a connection directly if no-one is using it and defer the closing to the last user otherwise. So far we only did so if the close was initiated by keep-alive timeout. --- diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c index ffe067c76d..99ab8007f2 100644 --- a/src/rpc/virnetclient.c +++ b/src/rpc/virnetclient.c @@ -108,8 +108,6 @@ struct _virNetClient { }; -static void virNetClientRequestClose(virNetClientPtr client); - static void virNetClientLock(virNetClientPtr client) { virMutexLock(&client->lock); @@ -253,7 +251,7 @@ virNetClientKeepAliveStart(virNetClientPtr client, static void virNetClientKeepAliveDeadCB(void *opaque) { - virNetClientRequestClose(opaque); + virNetClientClose(opaque); } static int @@ -512,19 +510,11 @@ virNetClientCloseLocked(virNetClientPtr client) void virNetClientClose(virNetClientPtr client) { + VIR_DEBUG("client=%p", client); + if (!client) return; - virNetClientLock(client); - virNetClientCloseLocked(client); - virNetClientUnlock(client); -} - -static void -virNetClientRequestClose(virNetClientPtr client) -{ - VIR_DEBUG("client=%p", client); - virNetClientLock(client); /* If there is a thread polling for data on the socket, set wantClose flag