From 8630a5ce95f88896140246c54f1f21c3c8b2a3ee Mon Sep 17 00:00:00 2001 From: Window Maker Date: Mon, 25 May 2026 11:58:14 +0200 Subject: [PATCH] wayland: handle SIGUSR2 via signalfd to reload defaults without dying SIGUSR2 was not in the signalfd set, so it was delivered asynchronously to the old signal handler which set WSTATE_NEED_REREAD. But the Wayland event loop never checked that state flag, and the signal delivery itself could crash the compositor. Add SIGUSR2 to the signalfd set and handle it synchronously within the event loop by calling wDefaultsCheckDomains directly. --- src/backend/wayland/wl_backend.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/backend/wayland/wl_backend.c b/src/backend/wayland/wl_backend.c index 4d4dc3c..8c485ba 100644 --- a/src/backend/wayland/wl_backend.c +++ b/src/backend/wayland/wl_backend.c @@ -3480,6 +3480,12 @@ wl_signalfd_handler(int fd, uint32_t mask, void *data) if (n != (ssize_t)sizeof(info)) return 0; + if (info.ssi_signo == SIGUSR2) { + wwarning("wl_backend: signalfd received SIGUSR2 - rereading defaults"); + wDefaultsCheckDomains(NULL); + return 0; + } + wwarning("wl_backend: signalfd received signal %u - terminating event loop", (unsigned)info.ssi_signo); @@ -3571,6 +3577,7 @@ wl_event_loop_run(void) sigaddset(&ss, SIGTERM); sigaddset(&ss, SIGINT); sigaddset(&ss, SIGHUP); + sigaddset(&ss, SIGUSR2); wl_state.sigfd = signalfd(-1, &ss, SFD_NONBLOCK | SFD_CLOEXEC); if (wl_state.sigfd >= 0) {