systemd/backport-udevd-don-t-use-monitor-after-manager_exit.patch
2023-12-06 16:52:45 +08:00

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