[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

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



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 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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]