users/24710: Fix job control problem with sudo.

If we use kill to test for continued existence of a process group,
we should check on failure that the error is ESRCH, as EPERM
indicates the group still has memebers but running privileged
so should be left alone.
This commit is contained in:
Peter Stephenson 2020-02-27 20:42:16 +00:00
parent fe516fccb4
commit 14ea665a90
4 changed files with 21 additions and 6 deletions

View File

@ -1,3 +1,10 @@
2020-02-27 Peter Stephenson <p.w.stephenson@ntlworld.com>
* users/24710: Src/exec.c, Src/jobs.c, Src/signals.c: when using
kill or killpg to test for continued existince of a process
group, check errono is ESRCH on failure as EPERM indicates
processes exist but under a different UID.
2020-02-27 Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>
* 45492: Test/D02glob.ztst: skip test added by users/24633

View File

@ -1036,7 +1036,8 @@ entersubsh(int flags, struct entersubsh_ret *retp)
} else if (thisjob != -1 && (flags & ESUB_PGRP)) {
if (jobtab[list_pipe_job].gleader && (list_pipe || list_pipe_child)) {
if (setpgrp(0L, jobtab[list_pipe_job].gleader) == -1 ||
killpg(jobtab[list_pipe_job].gleader, 0) == -1) {
(killpg(jobtab[list_pipe_job].gleader, 0) == -1 &&
errno == ESRCH)) {
jobtab[list_pipe_job].gleader =
jobtab[thisjob].gleader = (list_pipe_child ? mypgrp : getpid());
setpgrp(0L, jobtab[list_pipe_job].gleader);

View File

@ -283,7 +283,8 @@ handle_sub(int job, int fg)
if ((cp = ((WIFEXITED(jn->procs->status) ||
WIFSIGNALED(jn->procs->status)) &&
killpg(jn->gleader, 0) == -1))) {
(killpg(jn->gleader, 0) == -1 &&
errno == ESRCH)))) {
Process p;
for (p = jn->procs; p->next; p = p->next);
jn->gleader = p->pid;
@ -541,9 +542,13 @@ update_job(Job jn)
/* is this job in the foreground of an interactive shell? */
if (mypgrp != pgrp && inforeground &&
(jn->gleader == pgrp || (pgrp > 1 && kill(-pgrp, 0) == -1))) {
(jn->gleader == pgrp ||
(pgrp > 1 &&
(kill(-pgrp, 0) == -1 && errno == ESRCH)))) {
if (list_pipe) {
if (somestopped || (pgrp > 1 && kill(-pgrp, 0) == -1)) {
if (somestopped || (pgrp > 1 &&
kill(-pgrp, 0) == -1 &&
errno == ESRCH)) {
attachtty(mypgrp);
/* check window size and adjust if necessary */
adjustwinsize(0);
@ -2470,7 +2475,8 @@ bin_fg(char *name, char **argv, Options ops, int func)
if ((jobtab[job].stat & STAT_SUPERJOB) &&
((!jobtab[job].procs->next ||
(jobtab[job].stat & STAT_SUBLEADER) ||
killpg(jobtab[job].gleader, 0) == -1)) &&
(killpg(jobtab[job].gleader, 0) == -1 &&
errno == ESRCH))) &&
jobtab[jobtab[job].other].gleader)
attachtty(jobtab[jobtab[job].other].gleader);
else

View File

@ -539,7 +539,8 @@ wait_for_processes(void)
#endif
if (WIFEXITED(status) &&
pn->pid == jn->gleader &&
killpg(pn->pid, 0) == -1) {
killpg(pn->pid, 0) == -1 &&
errno == ESRCH) {
if (last_attached_pgrp == jn->gleader &&
!(jn->stat & STAT_NOSTTY)) {
/*