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(a)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