1
0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-09-28 06:49:49 +02:00

42624 (plus test): avoid freeing memory that's still needed

This was occurring in a multiple function definition where a
function name is duplicated.
This commit is contained in:
Oliver Kiddle 2018-04-12 23:15:04 +02:00
parent 2c4ec9dab0
commit 65b265f3c0
3 changed files with 25 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2018-04-12 Oliver Kiddle <okiddle@yahoo.co.uk>
* 42624 (plus test): Src/exec.c, Test/C04funcdef.ztst: avoid
freeing memory that's still needed in multiple function
definition that has a duplicated function name
2018-04-11 Peter Stephenson <p.stephenson@samsung.com>
* 42623: configure.ac: some extra quotes needed (and some

View File

@ -5042,7 +5042,7 @@ execfuncdef(Estate state, Eprog redir_prog)
Shfunc shf;
char *s = NULL;
int signum, nprg, sbeg, nstrs, npats, len, plen, i, htok = 0, ret = 0;
int nfunc = 0, anon_func = 0;
int anon_func = 0;
Wordcode beg = state->pc, end;
Eprog prog;
Patprog *pp;
@ -5118,12 +5118,16 @@ execfuncdef(Estate state, Eprog redir_prog)
/*
* redir_prog is permanently allocated --- but if
* this function has multiple names we need an additional
* one.
* one. Original redir_prog used with the last name
* because earlier functions are freed in case of duplicate
* names.
*/
if (nfunc++ && redir_prog)
if (names && nonempty(names) && redir_prog)
shf->redir = dupeprog(redir_prog, 0);
else
else {
shf->redir = redir_prog;
redir_prog = 0;
}
shfunc_set_sticky(shf);
if (!names) {
@ -5203,7 +5207,7 @@ execfuncdef(Estate state, Eprog redir_prog)
}
if (!anon_func)
setunderscore("");
if (!nfunc && redir_prog) {
if (redir_prog) {
/* For completeness, shouldn't happen */
freeeprog(redir_prog);
}

View File

@ -43,6 +43,16 @@
0:Function definition without braces
>bar
a a b() {
read word
print $0: $word
} <<<redirection
b
a
0:Multiple function definition with duplicate name and redirection
>b: redirection
>a: redirection
functions -M m1
m1() { (( $# )) }
print $(( m1() ))