mirror of
https://git.code.sf.net/p/zsh/code
synced 2026-01-26 11:14:28 +00:00
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:
parent
fe516fccb4
commit
14ea665a90
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
14
Src/jobs.c
14
Src/jobs.c
@ -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
|
||||
|
||||
@ -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)) {
|
||||
/*
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user