From 5ad66a9b72cbdb58a6668db4e16e0711318cadc2 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Sat, 24 Jan 2026 18:07:15 +0100 Subject: [PATCH 1/4] units/meson.build: rebreak lines --- units/meson.build | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/units/meson.build b/units/meson.build index 36dcb3f117..d64edec884 100644 --- a/units/meson.build +++ b/units/meson.build @@ -43,9 +43,7 @@ units = [ 'file' : 'getty.target', 'symlinks' : ['multi-user.target.wants/'], }, - { - 'file' : 'getty@.service.in', - }, + { 'file' : 'getty@.service.in' }, { 'file' : 'graphical.target', 'symlinks' : ['default.target'], From 1b2ad38b2b854f60142d7d4152f44eeda60dcf2d Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Sat, 24 Jan 2026 18:28:24 +0100 Subject: [PATCH 2/4] README: add epoll_pwait2() to the list of kernel APIs --- README | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README b/README index 3f4bce5c92..6d6b5729fc 100644 --- a/README +++ b/README @@ -58,7 +58,8 @@ REQUIREMENTS: ⛔ Kernel versions below 5.10 ("minimum baseline") are not supported at all, and are missing required functionality as listed above. - Linux kernel ≥ 5.12 for idmapped mount + Linux kernel ≥ 5.11 for epoll_pwait2() + ≥ 5.12 for idmapped mount (mount_setattr()) ≥ 5.14 for cgroup.kill and quotactl_fd() ⚠️ Kernel versions below 5.14 ("recommended baseline") have significant gaps From 21ebcb5814431fad1d2e805a040ed19776f4c35b Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Sat, 24 Jan 2026 18:33:05 +0100 Subject: [PATCH 3/4] sd-event: unpoison memory returned by epoll_pwait2() Our fuzzer CI recently got bumped to Ubuntu 24.04 with glibc >= 2.35. Apparently msan is not happy with the new epoll_pwait2(), hence explicitly mark the memory region as initialized. Fixes #40455 Alternative to #40463 --- src/libsystemd/sd-event/sd-event.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c index bd8f4118ef..e46dd4d0e9 100644 --- a/src/libsystemd/sd-event/sd-event.c +++ b/src/libsystemd/sd-event/sd-event.c @@ -4618,6 +4618,7 @@ static int process_epoll(sd_event *e, usec_t timeout, int64_t threshold, int64_t return r; m = (size_t) r; + msan_unpoison(e->event_queue, m * sizeof(struct epoll_event)); if (m < n_event_max) break; From cc94dca5bcf7644bf274b718802d1f454c02b4ce Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Sat, 24 Jan 2026 18:51:21 +0100 Subject: [PATCH 4/4] sd-event: use FOREACH_ARRAY --- src/libsystemd/sd-event/sd-event.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c index e46dd4d0e9..b78cfe86fa 100644 --- a/src/libsystemd/sd-event/sd-event.c +++ b/src/libsystemd/sd-event/sd-event.c @@ -4637,19 +4637,17 @@ static int process_epoll(sd_event *e, usec_t timeout, int64_t threshold, int64_t if (threshold == INT64_MAX) triple_timestamp_now(&e->timestamp); - for (size_t i = 0; i < m; i++) { + FOREACH_ARRAY(i, e->event_queue, m) { - if (e->event_queue[i].data.ptr == INT_TO_PTR(SOURCE_WATCHDOG)) - r = flush_timer(e, e->watchdog_fd, e->event_queue[i].events, NULL); + if (i->data.ptr == INT_TO_PTR(SOURCE_WATCHDOG)) + r = flush_timer(e, e->watchdog_fd, i->events, NULL); else { - WakeupType *t = e->event_queue[i].data.ptr; + WakeupType *t = ASSERT_PTR(i->data.ptr); switch (*t) { case WAKEUP_EVENT_SOURCE: { - sd_event_source *s = e->event_queue[i].data.ptr; - - assert(s); + sd_event_source *s = i->data.ptr; if (s->priority > threshold) continue; @@ -4659,15 +4657,15 @@ static int process_epoll(sd_event *e, usec_t timeout, int64_t threshold, int64_t switch (s->type) { case SOURCE_IO: - r = process_io(e, s, e->event_queue[i].events); + r = process_io(e, s, i->events); break; case SOURCE_CHILD: - r = process_pidfd(e, s, e->event_queue[i].events); + r = process_pidfd(e, s, i->events); break; case SOURCE_MEMORY_PRESSURE: - r = process_memory_pressure(s, e->event_queue[i].events); + r = process_memory_pressure(s, i->events); break; default: @@ -4678,20 +4676,18 @@ static int process_epoll(sd_event *e, usec_t timeout, int64_t threshold, int64_t } case WAKEUP_CLOCK_DATA: { - struct clock_data *d = e->event_queue[i].data.ptr; + struct clock_data *d = i->data.ptr; - assert(d); - - r = flush_timer(e, d->fd, e->event_queue[i].events, &d->next); + r = flush_timer(e, d->fd, i->events, &d->next); break; } case WAKEUP_SIGNAL_DATA: - r = process_signal(e, e->event_queue[i].data.ptr, e->event_queue[i].events, &min_priority); + r = process_signal(e, i->data.ptr, i->events, &min_priority); break; case WAKEUP_INOTIFY_DATA: - r = event_inotify_data_read(e, e->event_queue[i].data.ptr, e->event_queue[i].events, threshold); + r = event_inotify_data_read(e, i->data.ptr, i->events, threshold); break; default: