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.
This commit is contained in:
Window Maker 2026-05-25 11:58:14 +02:00
parent 9dee4f7a65
commit 8630a5ce95
1 changed files with 7 additions and 0 deletions

View File

@ -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) {