]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
inotify-util: declare iterator in FOREACH_INOTIFY_EVENT()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 24 Mar 2022 08:58:07 +0000 (17:58 +0900)
committerLuca Boccassi <luca.boccassi@gmail.com>
Thu, 24 Mar 2022 23:12:34 +0000 (23:12 +0000)
This also makes the macro check if the event is actually in the buffer,
and if it is not, then log about that and finish the loop.

src/basic/inotify-util.h
src/basic/terminal-util.c
src/core/cgroup.c
src/core/path.c
src/libsystemd/sd-journal/sd-journal.c
src/libsystemd/sd-network/sd-network.c
src/timesync/wait-sync.c
src/udev/udevd.c

index 88af08688f32e87c0b64d1fd6e34becfc4b71469..eaf1922bab65c2bda3fe1cb8718d782453414c7e 100644 (file)
@@ -6,12 +6,31 @@
 #include <stddef.h>
 #include <sys/inotify.h>
 
+#include "log.h"
+
 #define INOTIFY_EVENT_MAX (offsetof(struct inotify_event, name) + NAME_MAX + 1)
 
-#define FOREACH_INOTIFY_EVENT(e, buffer, sz) \
-        for ((e) = &buffer.ev;                                \
-             (uint8_t*) (e) < (uint8_t*) (buffer.raw) + (sz); \
-             (e) = (struct inotify_event*) ((uint8_t*) (e) + sizeof(struct inotify_event) + (e)->len))
+#define _FOREACH_INOTIFY_EVENT(e, buffer, sz, log_level, start, end)    \
+        for (struct inotify_event                                       \
+                            *start = &((buffer).ev),                    \
+                     *end = (struct inotify_event*) ((uint8_t*) start + (sz)), \
+                     *e = start;                                        \
+             (uint8_t*) e + sizeof(struct inotify_event) <= (uint8_t*) end && \
+             (uint8_t*) e + sizeof(struct inotify_event) + e->len <= (uint8_t*) end ? true : \
+                     ({                                                 \
+                             log_full(log_level, "Received invalid inotify event, ignoring."); \
+                             false;                                     \
+                     });                                                \
+             e = (struct inotify_event*) ((uint8_t*) e + sizeof(struct inotify_event) + e->len))
+
+#define _FOREACH_INOTIFY_EVENT_FULL(e, buffer, sz, log_level)           \
+        _FOREACH_INOTIFY_EVENT(e, buffer, sz, log_level, UNIQ_T(start, UNIQ), UNIQ_T(end, UNIQ))
+
+#define FOREACH_INOTIFY_EVENT(e, buffer, sz)                    \
+        _FOREACH_INOTIFY_EVENT_FULL(e, buffer, sz, LOG_DEBUG)
+
+#define FOREACH_INOTIFY_EVENT_WARN(e, buffer, sz)               \
+        _FOREACH_INOTIFY_EVENT_FULL(e, buffer, sz, LOG_WARNING)
 
 union inotify_event_buffer {
         struct inotify_event ev;
index 79bb33df847c78fe823aa7b1dc56f3b2649d80c2..6119f21c1b117f33a0c26658a5bcef8fd503c4e7 100644 (file)
@@ -432,7 +432,6 @@ int acquire_terminal(
 
                 for (;;) {
                         union inotify_event_buffer buffer;
-                        struct inotify_event *e;
                         ssize_t l;
 
                         if (timeout != USEC_INFINITY) {
index 42055e4e418ae701b5dbc0dfa60a2eccab7235b7..cf10f31d376c6da72d22e2f6c3f196d48de63c9a 100644 (file)
@@ -3227,7 +3227,6 @@ static int on_cgroup_inotify_event(sd_event_source *s, int fd, uint32_t revents,
 
         for (;;) {
                 union inotify_event_buffer buffer;
-                struct inotify_event *e;
                 ssize_t l;
 
                 l = read(fd, &buffer, sizeof(buffer));
@@ -3238,7 +3237,7 @@ static int on_cgroup_inotify_event(sd_event_source *s, int fd, uint32_t revents,
                         return log_error_errno(errno, "Failed to read control group inotify events: %m");
                 }
 
-                FOREACH_INOTIFY_EVENT(e, buffer, l) {
+                FOREACH_INOTIFY_EVENT_WARN(e, buffer, l) {
                         Unit *u;
 
                         if (e->wd < 0)
index d9b136f10c055143d3ac8fc88a2e9e366722195e..08143912221b14b4d5495c84b0000c467af2bf15 100644 (file)
@@ -173,7 +173,6 @@ void path_spec_unwatch(PathSpec *s) {
 
 int path_spec_fd_event(PathSpec *s, uint32_t revents) {
         union inotify_event_buffer buffer;
-        struct inotify_event *e;
         ssize_t l;
 
         assert(s);
@@ -191,7 +190,7 @@ int path_spec_fd_event(PathSpec *s, uint32_t revents) {
         }
 
         if (IN_SET(s->type, PATH_CHANGED, PATH_MODIFIED))
-                FOREACH_INOTIFY_EVENT(e, buffer, l)
+                FOREACH_INOTIFY_EVENT_WARN(e, buffer, l)
                         if (s->primary_wd == e->wd)
                                 return 1;
 
index 62755ed9659986d764914c481178c1b4b4b62e65..9a886711a99d721e27d6c67789cc882a6d4397d5 100644 (file)
@@ -2677,7 +2677,6 @@ _public_ int sd_journal_process(sd_journal *j) {
 
         for (;;) {
                 union inotify_event_buffer buffer;
-                struct inotify_event *e;
                 ssize_t l;
 
                 l = read(j->inotify_fd, &buffer, sizeof(buffer));
index e1e9a399c161ff780b63e23a8f8e4fcb16f2c9c2..a5612ab2d3bc3b6cea5a54d0afb4b32925e57f4a 100644 (file)
@@ -469,7 +469,6 @@ sd_network_monitor* sd_network_monitor_unref(sd_network_monitor *m) {
 
 int sd_network_monitor_flush(sd_network_monitor *m) {
         union inotify_event_buffer buffer;
-        struct inotify_event *e;
         ssize_t l;
         int fd, k;
 
index f42e6496bb3e7fdc9aaecdf2ab94479f6b693006..57e6cd3403d61996bcce6d6420c6a44df06fc5b7 100644 (file)
@@ -80,7 +80,6 @@ static int inotify_handler(sd_event_source *s,
         sd_event *event = sd_event_source_get_event(s);
         ClockState *sp = userdata;
         union inotify_event_buffer buffer;
-        struct inotify_event *e;
         ssize_t l;
 
         l = read(fd, &buffer, sizeof(buffer));
@@ -90,7 +89,7 @@ static int inotify_handler(sd_event_source *s,
 
                 return log_warning_errno(errno, "Lost access to inotify: %m");
         }
-        FOREACH_INOTIFY_EVENT(e, buffer, l)
+        FOREACH_INOTIFY_EVENT_WARN(e, buffer, l)
                 process_inotify_event(event, sp, e);
 
         return 0;
index 1e90b94f5c7da0f317f2effae16bc782fded4b41..108142e9c61919f86064b1146acac5d3b62e41cc 100644 (file)
@@ -1334,7 +1334,6 @@ static int synthesize_change(sd_device *dev) {
 static int on_inotify(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
         Manager *manager = userdata;
         union inotify_event_buffer buffer;
-        struct inotify_event *e;
         ssize_t l;
         int r;
 
@@ -1352,7 +1351,7 @@ static int on_inotify(sd_event_source *s, int fd, uint32_t revents, void *userda
                 return log_error_errno(errno, "Failed to read inotify fd: %m");
         }
 
-        FOREACH_INOTIFY_EVENT(e, buffer, l) {
+        FOREACH_INOTIFY_EVENT_WARN(e, buffer, l) {
                 _cleanup_(sd_device_unrefp) sd_device *dev = NULL;
                 const char *devnode;