[libvirt] [PATCH] remote: Prevent race when closing a connection
Viktor Mihajlovski
mihajlov at linux.vnet.ibm.com
Fri Mar 15 08:39:04 UTC 2013
On 03/15/2013 12:28 AM, Eric Blake wrote:
>> - if (conn->closeFreeCallback)
>> + if (conn->closeCallback)
>> + conn->closeCallback = NULL;
>
> The if is pointless. Just blindly set conn->closeCallback to NULL.
>
agreed
>> +
>> + if (conn->closeFreeCallback) {
>> conn->closeFreeCallback(conn->closeOpaque);
>> + conn->closeFreeCallback = NULL;
>> + conn->closeOpaque = NULL;
>
> Clearing conn->closeOpaque is pointless; it is only ever used depending
> on conn->closeFreeCallback, and leaving it non-NULL doesn't hurt.
>
I know, and didn't do it initially, but then wanted to make it common
with the callback deregistering code. And a small portion of paranoia
doesn't hurt as I have come to learn.
>
> ...Wouldn't it be better to stash a copy of the callback pointer while
> the mutex is held, but avoid calling the callback until after the mutex
> is unlocked? Something like:
>
> <TYPE> cb = NULL;
> void* opaque;
> virMutexLock(&conn->lock);
> conn->closeDispatch = false;
> if (conn->closeUnregisterCount != closeUnregisterCount) {
> cb = closeFreeCallback;
> opaque = closeOpaque;
> }
> virMutexUnlock(&conn->lock);
> if (cb)
> cb(opaque);
>
maybe, but this is again common to the other places where the
freeing callback is invoked, i.e. within the lock.
Waiting for Dan's comments...
--
Mit freundlichen Grüßen/Kind Regards
Viktor Mihajlovski
IBM Deutschland Research & Development GmbH
Vorsitzender des Aufsichtsrats: Martina Köderitz
Geschäftsführung: Dirk Wittkopp
Sitz der Gesellschaft: Böblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294
More information about the libvir-list
mailing list