1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-05-20 06:56:05 +02:00

38191: additional re-entrancy checks in reexpandprompt()

Do not free global pointers until after promptexpand() in case they are
referenced from signal handlers, and check for window size changes during
promptexpand().
This commit is contained in:
Barton E. Schaefer 2016-03-20 10:30:58 -07:00
parent 09e991a20a
commit 21202e7b95
2 changed files with 34 additions and 8 deletions

View File

@ -13,6 +13,13 @@
* m0viefreak: 38145: Doc/Zsh/zle.yo, Src/Zle/zle_params.c: Make
isearch and completion suffix variables visible as parameters.
2016-03-20 Barton E. Schaefer <schaefer@zsh.org>
* 38191: Src/Zle/zle_main.c: in reexpandprompt(), do not free global
pointers until after promptexpand() in case they are referenced from
signal handlers, and do additional re-entrancy checks in case of
window size changes during promptexpand().
2016-03-20 Barton E. Schaefer <schaefer@zsh.org>
* 38188: Src/pattern.c: signal re-entrancy, maybe

View File

@ -1856,6 +1856,7 @@ void
reexpandprompt(void)
{
static int reexpanding;
static int looping;
if (!reexpanding++) {
/*
@ -1866,15 +1867,33 @@ reexpandprompt(void)
int local_lastval = lastval;
lastval = pre_zle_status;
free(lpromptbuf);
lpromptbuf = promptexpand(raw_lp ? *raw_lp : NULL, 1, NULL, NULL,
&pmpt_attr);
rpmpt_attr = pmpt_attr;
free(rpromptbuf);
rpromptbuf = promptexpand(raw_rp ? *raw_rp : NULL, 1, NULL, NULL,
&rpmpt_attr);
do {
/* A new SIGWINCH may arrive while in promptexpand(), causing
* looping to increment. This only happens when a command
* substitution is used in a PROMPT_SUBST prompt, but
* nevertheless keep trying until we see no more changes.
*/
char *new_lprompt, *new_rprompt;
looping = reexpanding;
new_lprompt = promptexpand(raw_lp ? *raw_lp : NULL, 1, NULL, NULL,
&pmpt_attr);
free(lpromptbuf);
lpromptbuf = new_lprompt;
if (looping != reexpanding)
continue;
rpmpt_attr = pmpt_attr;
new_rprompt = promptexpand(raw_rp ? *raw_rp : NULL, 1, NULL, NULL,
&rpmpt_attr);
free(rpromptbuf);
rpromptbuf = new_rprompt;
} while (looping != reexpanding);
lastval = local_lastval;
}
} else
looping = reexpanding;
reexpanding--;
}