You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
2.3 KiB
46 lines
2.3 KiB
From b59fda96b0e24b93dcdb061da24c42a924ae0b20 Mon Sep 17 00:00:00 2001
|
|
From: Yu Watanabe <watanabe.yu+github@gmail.com>
|
|
Date: Mon, 9 Jan 2023 16:11:52 +0900
|
|
Subject: [PATCH] core/device: ignore failed uevents
|
|
|
|
When udevd failed to process the device, SYSTEMD_ALIAS or any other
|
|
properties may contain invalid values. Let's refuse to handle the uevent.
|
|
|
|
(cherry picked from commit e9336d6ac346df38d96c91ba0447b3c76ee6697b)
|
|
|
|
Related: RHEL-5988
|
|
---
|
|
src/core/device.c | 19 +++++++++++++++++++
|
|
1 file changed, 19 insertions(+)
|
|
|
|
diff --git a/src/core/device.c b/src/core/device.c
|
|
index 09b7d56e1e..f007bdfd9b 100644
|
|
--- a/src/core/device.c
|
|
+++ b/src/core/device.c
|
|
@@ -1108,6 +1108,25 @@ static int device_dispatch_io(sd_device_monitor *monitor, sd_device *dev, void *
|
|
if (action == SD_DEVICE_MOVE)
|
|
device_remove_old_on_move(m, dev);
|
|
|
|
+ /* When udevd failed to process the device, SYSTEMD_ALIAS or any other properties may contain invalid
|
|
+ * values. Let's refuse to handle the uevent. */
|
|
+ if (sd_device_get_property_value(dev, "UDEV_WORKER_FAILED", NULL) >= 0) {
|
|
+ int v;
|
|
+
|
|
+ if (device_get_property_int(dev, "UDEV_WORKER_ERRNO", &v) >= 0)
|
|
+ log_device_warning_errno(dev, v, "systemd-udevd failed to process the device, ignoring: %m");
|
|
+ else if (device_get_property_int(dev, "UDEV_WORKER_EXIT_STATUS", &v) >= 0)
|
|
+ log_device_warning(dev, "systemd-udevd failed to process the device with exit status %i, ignoring.", v);
|
|
+ else if (device_get_property_int(dev, "UDEV_WORKER_SIGNAL", &v) >= 0) {
|
|
+ const char *s;
|
|
+ (void) sd_device_get_property_value(dev, "UDEV_WORKER_SIGNAL_NAME", &s);
|
|
+ log_device_warning(dev, "systemd-udevd failed to process the device with signal %i(%s), ignoring.", v, strna(s));
|
|
+ } else
|
|
+ log_device_warning(dev, "systemd-udevd failed to process the device with unknown result, ignoring.");
|
|
+
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
/* A change event can signal that a device is becoming ready, in particular if the device is using
|
|
* the SYSTEMD_READY logic in udev so we need to reach the else block of the following if, even for
|
|
* change events */
|