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:
parent
9dee4f7a65
commit
8630a5ce95
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue