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 <eskultet@redhat.com>
This commit is contained in:
Erik Skultety 2017-07-26 10:45:11 +02:00
parent aceb74cbd7
commit 159be14d9c

View 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;
}