1
0
mirror of https://github.com/systemd/systemd.git synced 2024-10-28 11:55:44 +03:00

udevd: fix crash when workers time out after exit is signal caught

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 releasing the main process's monitor ref later, in
manager_free().

(cherry picked from commit 7b6596d748)
This commit is contained in:
Martin Wilck 2019-11-12 16:43:42 +01:00 committed by Zbigniew Jędrzejewski-Szmek
parent b774282a85
commit 5db454b803

View File

@ -296,6 +296,8 @@ static void manager_free(Manager *manager) {
if (!manager)
return;
manager->monitor = sd_device_monitor_unref(manager->monitor);
udev_builtin_exit();
if (manager->pid == getpid_cached())
@ -806,8 +808,6 @@ static void manager_exit(Manager *manager) {
manager->inotify_event = sd_event_source_unref(manager->inotify_event);
manager->fd_inotify = safe_close(manager->fd_inotify);
manager->monitor = sd_device_monitor_unref(manager->monitor);
/* discard queued events and kill workers */
event_queue_cleanup(manager, EVENT_QUEUED);
manager_kill_workers(manager);