[libvirt-users] issue with virErrorInitialize

Sharad Mishra snmishra at us.ibm.com
Mon Aug 22 16:31:04 UTC 2011



One of my team mate investigated the issue where libvirt-cim was
segfaulting when unloading providers. More info on this issue is at
https://www.redhat.com/archives/libvirt-users/2011-August/msg00069.html

Here is the gist of his investigation -


I've looked into the libvirt source code and the reason for issues with the
unload of libvirt-cim providers is there (and cimprovider -r forces an
unload,
just as cimserver shutdown does).

virConnectOpen() does call virInitialize() which then will initialize the
gcrypt library after initializes the thread setup ->virThreadInitialize(),
creates the error reporting structure ->virErrorInitialize() and initialize
a
random number generator ->virRandomInitialize().

The issue is hidden in virErrorInitialize(). It calls virErrorInitialize()
which uses the wrapper function virThreadLocalInit(&virLastErr,
virLastErrFreeData);.
virThreadLocalInit() calls pthread_create() with a destructor function
(virLastErrFreeData()) which will be called on thread exits.

Trouble here is that pthread_key_delete() is never called in libvirt, but
next
time the system runs through the key list and libvirt has been unloaded the
system will jump to an already unloaded function (the pointer were
virLastErrFreeData() was loaded formerly) and consequently crash the
process.

Fixing this will not be easy, but a start would be a libvirt function on
its
externalize interface that allows cleanup short before library unload, or
alternatively libvirt does the thread key delete on library unload.

Thanks
Sharad Mishra
Open Virtualization
Linux Technology Center
IBM
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libvirt-users/attachments/20110822/0cde4095/attachment.htm>


More information about the libvirt-users mailing list