aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Nieder <jrnieder@gmail.com>2011-03-15 16:01:34 +0800
committermaximilian attems <max@stro.at>2011-06-03 18:44:14 +0200
commit1d13581b9c08146c24d95168a53695187128ca35 (patch)
treec28637cb14c71e6c66257e40175e2391d9aa8457
parent8a6231c756cdfb04d636605211e808836f6bfb82 (diff)
downloadklibc-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.c7
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();
}