]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
shared/udev-util: fix sd_device leak in device_wait_for_initialization 16705/head
authorLuca Boccassi <luca.boccassi@microsoft.com>
Fri, 14 Aug 2020 10:05:42 +0000 (11:05 +0100)
committerLuca Boccassi <luca.boccassi@microsoft.com>
Fri, 14 Aug 2020 14:26:04 +0000 (15:26 +0100)
If the caller doesn't pass a return pointer, or if sd_event_loop fails
after the device was found and referenced, it never gets dereferenced.

src/shared/udev-util.c

index eb79bbbcf06189d40c96bf9fa9ea51429dcdacfc..8b27a6d0d0342e25510c7dec199fef934eb89329 100644 (file)
@@ -138,6 +138,12 @@ struct DeviceMonitorData {
         sd_device *device;
 };
 
+static void device_monitor_data_free(struct DeviceMonitorData *d) {
+        assert(d);
+
+        sd_device_unref(d->device);
+}
+
 static int device_monitor_handler(sd_device_monitor *monitor, sd_device *device, void *userdata) {
         struct DeviceMonitorData *data = userdata;
         const char *sysname;
@@ -183,7 +189,7 @@ static int device_wait_for_initialization_internal(
         _cleanup_(sd_event_unrefp) sd_event *event = NULL;
         /* Ensure that if !_device && devlink, device gets unrefd on errors since it will be new */
         _cleanup_(sd_device_unrefp) sd_device *device = sd_device_ref(_device);
-        struct DeviceMonitorData data = {
+        _cleanup_(device_monitor_data_free) struct DeviceMonitorData data = {
                 .devlink = devlink,
         };
         int r;