diff options
author | Jonathan Nieder <jrnieder@gmail.com> | 2011-03-15 16:01:34 +0800 |
---|---|---|
committer | maximilian attems <max@stro.at> | 2011-06-03 18:44:14 +0200 |
commit | 1d13581b9c08146c24d95168a53695187128ca35 (patch) | |
tree | c28637cb14c71e6c66257e40175e2391d9aa8457 | |
parent | 8a6231c756cdfb04d636605211e808836f6bfb82 (diff) | |
download | klibc-1d13581b9c08146c24d95168a53695187128ca35.tar.gz |
[klibc] [EXPAND] Free IFS state after here document expansion
Here's another bug bisecting to f42e443bb ([EXPAND] Fix
ifsfirst/ifslastp leak, 2010-09-08). It was found with the following
test case, based on the configure script for Tracker:
dash -x -c '
<<-_ACEOF
$@
_ACEOF
exec
' - abcdefgh
+
+ exec �a
exec: 1: : Permission denied
The missing ifsfree call is in expandarg when it returns to openhere
during here document expansion.
Reported-by: Aurelien Jarno <aurel32@debian.org>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: maximilian attems <max@stro.at>
-rw-r--r-- | usr/dash/expand.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/usr/dash/expand.c b/usr/dash/expand.c index cebeabe69dc72..355e924e87ed0 100644 --- a/usr/dash/expand.c +++ b/usr/dash/expand.c @@ -194,7 +194,8 @@ expandarg(union node *arg, struct arglist *arglist, int flag) p = _STPUTC('\0', expdest); expdest = p - 1; if (arglist == NULL) { - return; /* here document expanded */ + /* here document expanded */ + goto out; } p = grabstackstr(p); exparg.lastp = &exparg.list; @@ -212,12 +213,14 @@ expandarg(union node *arg, struct arglist *arglist, int flag) *exparg.lastp = sp; exparg.lastp = &sp->next; } - ifsfree(); *exparg.lastp = NULL; if (exparg.list) { *arglist->lastp = exparg.list; arglist->lastp = exparg.lastp; } + +out: + ifsfree(); } |