[libvirt] [PATCH] rpc: avoid libvirtd crash on unexpected client close

Eric Blake eblake at redhat.com
Tue Aug 2 13:52:32 UTC 2011


On 08/02/2011 04:41 AM, Daniel P. Berrange wrote:
> On Mon, Aug 01, 2011 at 01:53:19PM -0600, Eric Blake wrote:
>> Steps to reproduce this problem (vm1 is not running):
>> for i in `seq 50`; do virsh managedsave vm1&  done; killall virsh
>>
>> Pre-patch, virNetServerClientClose could end up setting client->sock
>> to NULL prior to other cleanup functions trying to use client->sock.
>> This fixes things by checking for NULL in more places, and by deferring
>> the cleanup until after all queued messages have been served.
>>
>

>
>> @@ -570,10 +577,7 @@ void virNetServerClientClose(virNetServerClientPtr client)
>>           virNetTLSSessionFree(client->tls);
>>           client->tls = NULL;
>>       }
>> -    if (client->sock) {
>> -        virNetSocketFree(client->sock);
>> -        client->sock = NULL;
>> -    }
>> +    client->wantClose = true;
>>
>>       while (client->rx) {
>>           virNetMessagePtr msg
>> @@ -586,6 +590,11 @@ void virNetServerClientClose(virNetServerClientPtr client)
>>           virNetMessageFree(msg);
>>       }
>>
>> +    if (client->sock) {
>> +        virNetSocketFree(client->sock);
>> +        client->sock = NULL;
>> +    }
>> +
>>       virNetServerClientUnlock(client);
>>   }
>
> I'm curious why you have these last 2 hunks of the patc ?  The entire
> of the virNetServerClientClose() is executed under the mutex, so AFAICT
> moving these 4 lines to later in the function can have no effect. The
> assignment to wantClose ought to not be needed at this point either,
> since this flag is used by the server to decide to invoke the
> virNetServerClientClose method.

I did it because virNetMessageFree calls a callback, and I didn't want 
to audit whether that callback might temporarily drop the mutex or 
reference client->sock.

>
> That all said, these 2 hunks are at worst harmless, so ACK to the
> patch.

Fair enough, so I pushed as-is.

-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org




More information about the libvir-list mailing list