]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udevd: don't use monitor after manager_exit() 14160/head
authorMartin Wilck <mwilck@suse.com>
Tue, 26 Nov 2019 17:39:09 +0000 (18:39 +0100)
committerMartin Wilck <mwilck@suse.com>
Tue, 26 Nov 2019 19:38:28 +0000 (20:38 +0100)
If udevd receives an exit signal, it releases its reference on the udev
monitor in manager_exit(). If at this time a worker is hanging, and if
the event timeout for this worker expires before udevd exits, udevd
crashes in on_sigchld()->udev_monitor_send_device(), because the monitor
has already been freed.

Fix this by testing the validity of manager->monitor in on_sigchld().

src/udev/udevd.c

index 144a20ec63fbcf2db2e14844e6df4f6994f4ead5..7678331897f5e988a66ef2dba903433fae518091 100644 (file)
@@ -1311,10 +1311,12 @@ static int on_sigchld(sd_event_source *s, const struct signalfd_siginfo *si, voi
                         device_delete_db(worker->event->dev);
                         device_tag_index(worker->event->dev, NULL, false);
 
-                        /* forward kernel event without amending it */
-                        r = device_monitor_send_device(manager->monitor, NULL, worker->event->dev_kernel);
-                        if (r < 0)
-                                log_device_error_errno(worker->event->dev_kernel, r, "Failed to send back device to kernel: %m");
+                        if (manager->monitor) {
+                                /* forward kernel event without amending it */
+                                r = device_monitor_send_device(manager->monitor, NULL, worker->event->dev_kernel);
+                                if (r < 0)
+                                        log_device_error_errno(worker->event->dev_kernel, r, "Failed to send back device to kernel: %m");
+                        }
                 }
 
                 worker_free(worker);