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:
parent
09e991a20a
commit
21202e7b95
|
@ -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
|
||||
|
|
|
@ -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--;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue