]> xenbits.xensource.com Git - libvirt.git/commitdiff
nodedev: Fix double unlock of the driver on udevEnumerateDevices failure
authorErik Skultety <eskultet@redhat.com>
Wed, 26 Jul 2017 08:45:11 +0000 (10:45 +0200)
committerErik Skultety <eskultet@redhat.com>
Fri, 28 Jul 2017 08:52:28 +0000 (10:52 +0200)
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 <eskultet@redhat.com>
src/node_device/node_device_udev.c

index 4762f19699f244d51636c736187be7c0c5dedb29..4c35fd5c981df6f82a639598eb1e9fe5bcfeb45e 100644 (file)
@@ -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;
 }