1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-01-10 08:01:41 +01:00

29677: Do not allow external processes in a pipeline to become suspended

when the end of the pipe is controlled by a builtin in the current shell
which cannot itself become suspended.
This commit is contained in:
Bart Schaefer 2011-08-14 18:34:27 +00:00
parent 8af2cbd1f2
commit 516ea294b8
4 changed files with 24 additions and 6 deletions

View file

@ -11,6 +11,13 @@
* unposted: Src/jobs.c: fix capitalized word in the middle of
a sentence.
2011-08-14 Barton E. Schaefer <schaefer@zsh.org>
* 29677: Src/exec.c, Src/signals.c, Src/zsh.h: flag jobs that are
builtins running in the current shell, and if they control a
pipeline, do not allow the external processes in that pipeline to
become suspended when the foreground shell cannot suspend.
2011-08-11 Peter Stephenson <p.w.stephenson@ntlworld.com>
* Src/Modules/datetime.mdd: unposted: also fix the autofeatures.
@ -15247,5 +15254,5 @@
*****************************************************
* This is used by the shell to define $ZSH_PATCHLEVEL
* $Revision: 1.5426 $
* $Revision: 1.5427 $
*****************************************************

View file

@ -2848,6 +2848,8 @@ execcmd(Estate state, int input, int output, int how, int last1)
jobtab[thisjob].stat |= STAT_CURSH;
if (!jobtab[thisjob].procs)
jobtab[thisjob].stat |= STAT_NOPRINT;
if (is_builtin)
jobtab[thisjob].stat |= STAT_BUILTIN;
} else {
/* This is an exec (real or fake) for an external command. *
* Note that any form of exec means that the subshell is fake *

View file

@ -490,6 +490,12 @@ wait_for_processes(void)
* update it.
*/
if (findproc(pid, &jn, &pn, 0)) {
if (((jn->stat & STAT_BUILTIN) ||
(list_pipe && (jobtab[thisjob].stat & STAT_BUILTIN))) &&
WIFSTOPPED(status) && WSTOPSIG(status) == SIGTSTP) {
killjb(jn, SIGCONT);
zwarn("job can't be suspended");
} else {
#if defined(HAVE_WAIT3) && defined(HAVE_GETRUSAGE)
struct timezone dummy_tz;
gettimeofday(&pn->endtime, &dummy_tz);
@ -498,6 +504,7 @@ wait_for_processes(void)
#else
update_process(pn, status);
#endif
}
update_job(jn);
} else if (findproc(pid, &jn, &pn, 1)) {
pn->status = status;

View file

@ -907,6 +907,8 @@ struct job {
#define STAT_ATTACH (0x1000) /* delay reattaching shell to tty */
#define STAT_SUBLEADER (0x2000) /* is super-job, but leader is sub-shell */
#define STAT_BUILTIN (0x4000) /* job at tail of pipeline is a builtin */
#define SP_RUNNING -1 /* fake status for jobs currently running */
struct timeinfo {