Merge branch 'restore-signals-when-spawning-subprocess'

Closes #366
This commit is contained in:
Daniel Eklöf 2021-02-21 20:00:31 +01:00
commit 0bda60aacc
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
4 changed files with 15 additions and 8 deletions

View file

@ -81,6 +81,8 @@
`shift` to be pressed while used in a mouse grabbing `shift` to be pressed while used in a mouse grabbing
application. This meant the mouse event was never seen by the application. This meant the mouse event was never seen by the
application. application.
* Terminals spawned with `ctrl`+`shift`+`n` not terminating when
exiting shell (https://codeberg.org/dnkl/foot/issues/366).
### Security ### Security

1
fdm.c
View file

@ -27,7 +27,6 @@ struct fd_handler {
}; };
struct sig_handler { struct sig_handler {
int signo;
fdm_signal_handler_t callback; fdm_signal_handler_t callback;
void *callback_data; void *callback_data;
}; };

View file

@ -274,15 +274,10 @@ slave_spawn(int ptmx, int argc, const char *cwd, char *const *argv,
_exit(_errno); _exit(_errno);
} }
/* Restore signals */ /* Restore signal mask */
sigset_t mask; sigset_t mask;
sigemptyset(&mask); sigemptyset(&mask);
const struct sigaction sa = {.sa_handler = SIG_DFL}; if (sigprocmask(SIG_SETMASK, &mask, NULL) < 0) {
if (sigaction(SIGINT, &sa, NULL) < 0 ||
sigaction(SIGTERM, &sa, NULL) < 0 ||
sigaction(SIGHUP, &sa, NULL) < 0 ||
sigprocmask(SIG_SETMASK, &mask, NULL) < 0)
{
const int _errno = errno; const int _errno = errno;
LOG_ERRNO_P(errno, "failed to restore signals"); LOG_ERRNO_P(errno, "failed to restore signals");
(void)!write(fork_pipe[1], &_errno, sizeof(_errno)); (void)!write(fork_pipe[1], &_errno, sizeof(_errno));

11
spawn.c
View file

@ -3,6 +3,7 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <errno.h> #include <errno.h>
#include <signal.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
@ -34,6 +35,16 @@ spawn(struct reaper *reaper, const char *cwd, char *const argv[],
/* Child */ /* Child */
close(pipe_fds[0]); close(pipe_fds[0]);
/* Clear signal mask */
sigset_t mask;
sigemptyset(&mask);
if (sigprocmask(SIG_SETMASK, &mask, NULL) < 0) {
const int _errno = errno;
LOG_ERRNO_P(errno, "failed to restore signals");
(void)!write(pipe_fds[1], &_errno, sizeof(_errno));
_exit(_errno);
}
if ((stdin_fd >= 0 && (dup2(stdin_fd, STDIN_FILENO) < 0 || close(stdin_fd) < 0)) || if ((stdin_fd >= 0 && (dup2(stdin_fd, STDIN_FILENO) < 0 || close(stdin_fd) < 0)) ||
(stdout_fd >= 0 && (dup2(stdout_fd, STDOUT_FILENO) < 0 || close(stdout_fd) < 0)) || (stdout_fd >= 0 && (dup2(stdout_fd, STDOUT_FILENO) < 0 || close(stdout_fd) < 0)) ||
(stderr_fd >= 0 && (dup2(stderr_fd, STDERR_FILENO) < 0 || close(stderr_fd) < 0)) || (stderr_fd >= 0 && (dup2(stderr_fd, STDERR_FILENO) < 0 || close(stderr_fd) < 0)) ||