From a72b2688bda87a20d029e80eaf8d6686ca95003e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Wed, 2 Jun 2021 17:48:57 +0200 Subject: [PATCH] slave/spawn: restore SIGHUP handler after fork(), before exec() Foot installs a SIG_IGN handler for SIGHUP. Ignored signals are inherited in sub-processes. Thus, we need to restore it to SIG_DFL before exec:ing. --- CHANGELOG.md | 1 + slave.c | 6 ++++-- spawn.c | 4 ++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e727ad6..f38db526 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -151,6 +151,7 @@ in the right-most column. * Multi-column characters being cut in half when resizing the alternate screen. +* Restore `SIGHUP` in spawned processes. ### Security diff --git a/slave.c b/slave.c index 6a431d02..8e800214 100644 --- a/slave.c +++ b/slave.c @@ -274,10 +274,12 @@ slave_spawn(int ptmx, int argc, const char *cwd, char *const *argv, _exit(errno_copy); } - /* Restore signal mask */ + /* Restore signal mask, and SIG_IGN'd signals */ sigset_t mask; sigemptyset(&mask); - if (sigprocmask(SIG_SETMASK, &mask, NULL) < 0) { + if (sigprocmask(SIG_SETMASK, &mask, NULL) < 0 || + sigaction(SIGHUP, &(struct sigaction){.sa_handler = SIG_DFL}, NULL) < 0) + { const int errno_copy = errno; LOG_ERRNO_P(errno, "failed to restore signals"); (void)!write(fork_pipe[1], &errno_copy, sizeof(errno_copy)); diff --git a/spawn.c b/spawn.c index 99f1dc7e..22f0d1ed 100644 --- a/spawn.c +++ b/spawn.c @@ -44,6 +44,10 @@ spawn(struct reaper *reaper, const char *cwd, char *const argv[], if (sigprocmask(SIG_SETMASK, &mask, NULL) < 0) goto child_err; + /* Restore ignored (SIG_IGN) signals */ + if (sigaction(SIGHUP, &(struct sigaction){.sa_handler = SIG_DFL}, NULL) < 0) + goto child_err; + bool close_stderr = stderr_fd >= 0; bool close_stdout = stdout_fd >= 0 && stdout_fd != stderr_fd; bool close_stdin = stdin_fd >= 0 && stdin_fd != stdout_fd && stdin_fd != stderr_fd;