diff --git a/ChangeLog b/ChangeLog index 7db41c6b..ac2fda83 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2010-03-23 Nicolas François + + * src/su.c, src/vipw.c, src/newgrp.c: When the child is + interrupted, stop ourself with a SIGSTOP signal. + 2010-03-23 Nicolas François * src/newgrp.c: Limit the scope of variable pid. diff --git a/src/newgrp.c b/src/newgrp.c index 167b10bf..10204c7c 100644 --- a/src/newgrp.c +++ b/src/newgrp.c @@ -322,8 +322,9 @@ static void syslog_sg (const char *name, const char *group) errno = 0; pid = waitpid (child, &cst, WUNTRACED); if ((pid == child) && (WIFSTOPPED (cst) != 0)) { - /* stop when child stops */ - kill (getpid (), WSTOPSIG(cst)); + /* The child (shell) was suspended. + * Suspend sg/newgrp. */ + kill (getpid (), SIGSTOP); /* wake child when resumed */ kill (child, SIGCONT); } diff --git a/src/su.c b/src/su.c index a0ee6d8d..837e76c3 100644 --- a/src/su.c +++ b/src/su.c @@ -313,7 +313,7 @@ static void run_shell (const char *shellstr, char *args[], bool doshell, if (((pid_t)-1 != pid) && (0 != WIFSTOPPED (status))) { /* The child (shell) was suspended. * Suspend su. */ - kill (getpid (), WSTOPSIG(status)); + kill (getpid (), SIGSTOP); /* wake child when resumed */ kill (pid, SIGCONT); } diff --git a/src/vipw.c b/src/vipw.c index 81c4b7c7..d3246e32 100644 --- a/src/vipw.c +++ b/src/vipw.c @@ -310,7 +310,7 @@ vipwedit (const char *file, int (*file_lock) (void), int (*file_unlock) (void)) if ((pid != -1) && (WIFSTOPPED (status) != 0)) { /* The child (editor) was suspended. * Suspend vipw. */ - kill (getpid (), WSTOPSIG (status)); + kill (getpid (), SIGSTOP); /* wake child when resumed */ kill (pid, SIGCONT); } else {