[libvirt] [PATCH] tests: fix segault in objecteventtest
Michal Privoznik
mprivozn at redhat.com
Wed Aug 24 16:42:25 UTC 2016
On 24.08.2016 12:55, Roman Bogorodskiy wrote:
> Test 12 from objecteventtest (createXML add event) segaults on FreeBSD
> with bus error.
>
> At some point it calls testNodeDeviceDestroy() from the test driver. And
> it fails when it tries to unlock the device in the "out:" label of this
> function.
>
> Unlocking fails because the previous step was a call to
> virNodeDeviceObjRemove from conf/node_device_conf.c. This function
> removes the given device from the device list and cleans up the object,
> including destroying of its mutex. However, it does not nullify the pointer
> that was given to it.
>
> As a result, we end up in testNodeDeviceDestroy() here:
>
> out:
> if (obj)
> virNodeDeviceObjUnlock(obj);
>
> And instead of skipping this, we try to do Unlock and fail because of
> malformed mutex.
>
> Fix this by nullifying obj passed to virNodeDeviceObjRemove.
> ---
> src/conf/node_device_conf.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
> index a23d8ef..16b9d93 100644
> --- a/src/conf/node_device_conf.c
> +++ b/src/conf/node_device_conf.c
> @@ -218,6 +218,7 @@ void virNodeDeviceObjRemove(virNodeDeviceObjListPtr devs,
> if (devs->objs[i] == dev) {
> virNodeDeviceObjUnlock(dev);
> virNodeDeviceObjFree(devs->objs[i]);
> + *(void**)dev = NULL;
>
> VIR_DELETE_ELEMENT(devs->objs, i, devs->count);
> break;
>
This is very hackish. It only clears first 8 bytes of the struct so next
time somebody tries to access the lock in there it's all zeroes.
Either we should make virNodeDeviceObjRemove() take a double pointer
(and thus set the pointer to NULL properly), or fix every caller of
virNodeDeviceObjRemove().
Michal
More information about the libvir-list
mailing list