pty: unblock all signals before exec'ing the child
When we register signals in the eloop we also block them in our signal mask. The signal mask is inherited by the child. Therefore, if the child does not reset its mask (e.g. bash and most normal processes), it will not receive any of the signals that we handle. So for example C-c (SIGINT) does nothing in the child process. We now unblock all signals before we exec the child. [It's also worth noting that if we _ignore_ a signal - sigaction(SIG_IGN) - this is also inherited and we must reset it to default. However, we do not ignore signals so this is unneeded.] Here is some more discussion on signalfd and this problem: https://lwn.net/Articles/415684/ Signed-off-by: Ran Benita <ran234@gmail.com>
This commit is contained in:
parent
8e6803ed0a
commit
9790298333
10
src/pty.c
10
src/pty.c
@ -30,6 +30,7 @@
|
||||
#include <fcntl.h>
|
||||
#include <paths.h>
|
||||
#include <pty.h>
|
||||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/ioctl.h>
|
||||
@ -122,10 +123,19 @@ exec_child(int pty_master)
|
||||
static int fork_pty_child(int master, struct winsize *ws)
|
||||
{
|
||||
int ret, saved_errno;
|
||||
sigset_t sigset;
|
||||
pid_t pid;
|
||||
const char *slave_name;
|
||||
int slave = -1;
|
||||
|
||||
/* The child should not inherit our signal mask. */
|
||||
sigfillset(&sigset);
|
||||
ret = sigprocmask(SIG_UNBLOCK, &sigset, NULL);
|
||||
if (ret) {
|
||||
log_warning("pty: cannot unblock all signals: %m\n");
|
||||
/* This is non fatal. */
|
||||
}
|
||||
|
||||
/* This doesn't actually do anything on linux. */
|
||||
ret = grantpt(master);
|
||||
if (ret < 0) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user