1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-01 21:51:40 +02:00

Merge of 22983: exit could loop for ever in two different ways.

This commit is contained in:
Paul Ackersviller 2007-11-05 02:38:53 +00:00
parent d3a79df906
commit 3cf23604b0
2 changed files with 20 additions and 0 deletions

View file

@ -4186,6 +4186,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))
@ -4195,9 +4199,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);

View file

@ -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;