mirror of
https://github.com/zsh-users/zsh
synced 2024-09-29 04:35:22 +00:00
22983: exit could loop for ever
This commit is contained in:
parent
96f525f468
commit
aa2ae64dff
|
@ -1,5 +1,8 @@
|
|||
2006-11-08 Peter Stephenson <pws@csr.com>
|
||||
|
||||
* 22983: Src/builtin.c, Src/init.c: exit could loop for ever
|
||||
in two different ways (but not at the same time).
|
||||
|
||||
* 22978 (tweaked): Doc/Zsh/func.yo, Doc/Zsh/options.yo,
|
||||
Src/builtin.c, Src/init.c, Src/utils.c, Src/Zle/zle_main.c,
|
||||
Test/A05execution.ztst: use <hook>_functions array variables for
|
||||
|
|
|
@ -4391,6 +4391,10 @@ zexit(int val, int from_where)
|
|||
{
|
||||
static int in_exit;
|
||||
|
||||
/* Don't do anything recursively: see below */
|
||||
if (in_exit == -1)
|
||||
return;
|
||||
|
||||
if (isset(MONITOR) && !stopmsg && from_where != 1) {
|
||||
scanjobs(); /* check if jobs need printing */
|
||||
if (isset(CHECKJOBS))
|
||||
|
@ -4400,9 +4404,16 @@ zexit(int val, int from_where)
|
|||
return;
|
||||
}
|
||||
}
|
||||
/* Positive in_exit means we have been here before */
|
||||
if (from_where == 2 || (in_exit++ && from_where))
|
||||
return;
|
||||
|
||||
/*
|
||||
* We're now committed to exiting. Set in_exit to -1 to
|
||||
* indicate we shouldn't do any recursive processing.
|
||||
*/
|
||||
in_exit = -1;
|
||||
|
||||
if (isset(MONITOR)) {
|
||||
/* send SIGHUP to any jobs left running */
|
||||
killrunjobs(from_where == 1);
|
||||
|
|
|
@ -131,6 +131,15 @@ loop(int toplevel, int justonce)
|
|||
(tok == LEXERR && (!isset(SHINSTDIN) || !toplevel)) ||
|
||||
justonce)
|
||||
break;
|
||||
if (exit_pending) {
|
||||
/*
|
||||
* Something down there (a ZLE function?) decided
|
||||
* to exit when there was stuff to clear up.
|
||||
* Handle that now.
|
||||
*/
|
||||
stopmsg = 1;
|
||||
zexit(exit_pending >> 1, 0);
|
||||
}
|
||||
if (tok == LEXERR && !lastval)
|
||||
lastval = 1;
|
||||
continue;
|
||||
|
|
Loading…
Reference in a new issue