summaryrefslogtreecommitdiff
path: root/src/udev/udev-event.c
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-03-06 20:45:17 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2021-04-30 19:21:18 +0900
commit0d77bc4a18efa21022fe90cf8d6051a7b5b039f3 (patch)
tree7e85ac5ec208c4d211278f1decfcdd4e3752b243 /src/udev/udev-event.c
parent4cac2260c8ef6a324c95461888c02db32f6c1eb2 (diff)
downloadsystemd-0d77bc4a18efa21022fe90cf8d6051a7b5b039f3.tar.gz
udev: refuse to enable inotify watch on remove event
Some udev rule may erroneously set inotify watch on remove event. For safety, silently ignore such an inotify watch enablement. This also moves inotify watch enablement code to udev-event.c.
Diffstat (limited to 'src/udev/udev-event.c')
-rw-r--r--src/udev/udev-event.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c
index 2e82be6fb3..f4dbcef959 100644
--- a/src/udev/udev-event.c
+++ b/src/udev/udev-event.c
@@ -1082,3 +1082,34 @@ void udev_event_execute_run(UdevEvent *event, usec_t timeout_usec, int timeout_s
}
}
}
+
+int udev_event_process_inotify_watch(UdevEvent *event, int inotify_fd) {
+ sd_device *dev;
+ int r;
+
+ assert(event);
+ assert(inotify_fd >= 0);
+
+ dev = event->dev;
+
+ assert(dev);
+
+ if (device_for_action(dev, SD_DEVICE_REMOVE))
+ return 0;
+
+ if (sd_device_get_devname(dev, NULL) < 0)
+ return 0;
+
+ if (!event->inotify_watch) {
+ (void) udev_watch_end(inotify_fd, dev);
+ return 0;
+ }
+
+ (void) udev_watch_begin(inotify_fd, dev);
+
+ r = device_update_db(dev);
+ if (r < 0)
+ return log_device_debug_errno(dev, r, "Failed to update database under /run/udev/data/: %m");
+
+ return 0;
+}