ash: fix ifs cleanup on error paths

Patch by Alex Gorinson <algore3698@gmail.com>

function                                             old     new   delta
evalvar                                              477     495     +18
varvalue                                             603     618     +15
subevalvar                                          1557    1572     +15
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/0 up/down: 48/0)               Total: 48 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2022-08-02 11:13:44 +02:00
parent 5479c435fd
commit 1c54552842
5 changed files with 22 additions and 0 deletions

View File

@ -7028,6 +7028,7 @@ varunset(const char *end, const char *var, const char *umsg, int varflags)
msg = umsg;
}
}
ifsfree();
ash_msg_and_raise_error("%.*s: %s%s", (int)(end - var - 1), var, msg, tail);
}
@ -7453,6 +7454,7 @@ varvalue(char *name, int varflags, int flags, int quoted)
if (discard)
return -1;
ifsfree();
raise_error_syntax("bad substitution");
}

View File

@ -0,0 +1,2 @@
./heredoc_and_cmd.tests: line 4: D: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Y

View File

@ -0,0 +1,8 @@
# The bug was only happening with <<REDIR;CMD form below:
M='AAAAAAAAAAAAAAAAA'
fff(){
date <<000; echo Y
${D?$M$M$M$M$M$M}
000
}
fff

View File

@ -0,0 +1,2 @@
hush: D: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Y

View File

@ -0,0 +1,8 @@
# The bug was only happening with <<REDIR;CMD form below:
M='AAAAAAAAAAAAAAAAA'
fff(){
date <<000; echo Y
${D?$M$M$M$M$M$M}
000
}
fff