[libvirt] [PATCH 5/5] nodedev: Protect every access to udev_monitor by locking the driver

Erik Skultety eskultet at redhat.com
Wed Jul 26 06:44:04 UTC 2017


Since @udev_monitor isn't immutable within the driver, we need to
protect every access to it by locking the driver, so that no spurious
action changing the pointer while one thread is actively using it might
occur. This patch just takes some precaution measures.

Signed-off-by: Erik Skultety <eskultet at redhat.com>
---
 src/node_device/node_device_udev.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c
index 7ecb330df..0643a5845 100644
--- a/src/node_device/node_device_udev.c
+++ b/src/node_device/node_device_udev.c
@@ -1623,9 +1623,13 @@ udevEventHandleCallback(int watch ATTRIBUTE_UNUSED,
                         void *data ATTRIBUTE_UNUSED)
 {
     struct udev_device *device = NULL;
-    struct udev_monitor *udev_monitor = DRV_STATE_UDEV_MONITOR(driver);
+    struct udev_monitor *udev_monitor = NULL;
     int udev_fd = -1;
 
+    nodeDeviceLock();
+    if (!(udev_monitor = DRV_STATE_UDEV_MONITOR(driver)))
+        goto error;
+
     udev_fd = udev_monitor_get_fd(udev_monitor);
     if (fd != udev_fd) {
         udevPrivate *priv = driver->privateData;
@@ -1640,22 +1644,26 @@ udevEventHandleCallback(int watch ATTRIBUTE_UNUSED,
          * the same error multiple times
          */
         virEventRemoveHandle(priv->watch);
-
-        goto cleanup;
+        goto error;
     }
 
     device = udev_monitor_receive_device(udev_monitor);
     if (device == NULL) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                        _("udev_monitor_receive_device returned NULL"));
-        goto cleanup;
+        goto error;
     }
 
+    nodeDeviceUnlock();
     udevHandleOneDevice(device);
 
  cleanup:
     udev_device_unref(device);
     return;
+
+ error:
+    nodeDeviceUnlock();
+    goto cleanup;
 }
 
 
-- 
2.13.3




More information about the libvir-list mailing list