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

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

 



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

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]
  Powered by Linux