43 lines
2.0 KiB
Diff
43 lines
2.0 KiB
Diff
From 030f4571670537c76355c5d923468c9a61aa77e9 Mon Sep 17 00:00:00 2001
|
|
From: Martin Wilck <mwilck@suse.com>
|
|
Date: Tue, 26 Nov 2019 18:39:09 +0100
|
|
Subject: [PATCH 0747/1760] udevd: don't use monitor after manager_exit()
|
|
|
|
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().
|
|
Reference: https://github.com/systemd/systemd/commit/030f4571670537c76355c5d923468c9a61aa77e9
|
|
Conflict: NA
|
|
---
|
|
src/udev/udevd.c | 10 ++++++----
|
|
1 file changed, 6 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/src/udev/udevd.c b/src/udev/udevd.c
|
|
index 144a20e..7678331 100644
|
|
--- a/src/udev/udevd.c
|
|
+++ b/src/udev/udevd.c
|
|
@@ -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);
|
|
--
|
|
1.8.3.1
|
|
|