From: Erik Skultety Date: Wed, 26 Jul 2017 08:45:11 +0000 (+0200) Subject: nodedev: Fix double unlock of the driver on udevEnumerateDevices failure X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=159be14d9cda837c6d67cdb8e1c88c2231b4ae36;p=libvirt.git nodedev: Fix double unlock of the driver on udevEnumerateDevices failure Commit @4cb719b2dc moved the driver locks around since these have become unnecessary at spots where the code handles now self-lockable object list, but missed the possible double unlock if udevEnumerateDevices fails, because at that point the driver lock had been already dropped. Signed-off-by: Erik Skultety --- diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c index 4762f19699..4c35fd5c98 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -1789,18 +1789,18 @@ nodeStateInitialize(bool privileged, nodeDeviceLock(); if (!(driver->devs = virNodeDeviceObjListNew())) - goto cleanup; + goto unlock; driver->nodeDeviceEventState = virObjectEventStateNew(); if (udevPCITranslateInit(privileged) < 0) - goto cleanup; + goto unlock; udev = udev_new(); if (!udev) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("failed to create udev context")); - goto cleanup; + goto unlock; } #if HAVE_UDEV_LOGGING /* cast to get rid of missing-format-attribute warning */ @@ -1811,7 +1811,7 @@ nodeStateInitialize(bool privileged, if (priv->udev_monitor == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("udev_monitor_new_from_netlink returned NULL")); - goto cleanup; + goto unlock; } udev_monitor_enable_receiving(priv->udev_monitor); @@ -1837,11 +1837,11 @@ nodeStateInitialize(bool privileged, VIR_EVENT_HANDLE_READABLE, udevEventHandleCallback, NULL, NULL); if (priv->watch == -1) - goto cleanup; + goto unlock; /* Create a fictional 'computer' device to root the device tree. */ if (udevSetupSystemDev() != 0) - goto cleanup; + goto unlock; nodeDeviceUnlock(); @@ -1852,9 +1852,12 @@ nodeStateInitialize(bool privileged, return 0; cleanup: - nodeDeviceUnlock(); nodeStateCleanup(); return -1; + + unlock: + nodeDeviceUnlock(); + goto cleanup; }