aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2010-05-25 18:14:32 +0800
committermaximilian attems <max@stro.at>2011-06-03 18:04:48 +0200
commit6aacbff0ba1523aa8272340ec14aacde4a649bc8 (patch)
treeb94e59b1d2c150035a59f76700cbf6d32746e7a5
parent85712e2d1287222f27f470e04cf49394cfdcf81f (diff)
downloadklibc-6aacbff0ba1523aa8272340ec14aacde4a649bc8.tar.gz
[klibc] [VAR] Fix poplocalvar leak
When a variable is marked as local, we set VSTRFIXED on its vp recored. However, poplocalvar never clears this flag for variables that were unset to begin with. Thus if you ever made an unset variable local, it would get the VSTRFIXED bit and stick around forever. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: maximilian attems <max@stro.at>
-rw-r--r--usr/dash/var.c8
1 files changed, 3 insertions, 5 deletions
diff --git a/usr/dash/var.c b/usr/dash/var.c
index de1a5f54ea4ae..fc6d367828d03 100644
--- a/usr/dash/var.c
+++ b/usr/dash/var.c
@@ -543,7 +543,8 @@ poplocalvars(void)
memcpy(optlist, lvp->text, sizeof(optlist));
ckfree(lvp->text);
optschanged();
- } else if ((lvp->flags & (VUNSET|VSTRFIXED)) == VUNSET) {
+ } else if (lvp->flags == VUNSET) {
+ vp->flags &= ~(VSTRFIXED|VREADONLY);
unsetvar(vp->text);
} else {
if (vp->func)
@@ -627,8 +628,6 @@ unsetvar(const char *s)
retval = 1;
if (flags & VREADONLY)
goto out;
- if (flags & VUNSET)
- goto ok;
if ((flags & VSTRFIXED) == 0) {
INTOFF;
if ((flags & (VTEXTFIXED|VSTACK)) == 0)
@@ -636,11 +635,10 @@ unsetvar(const char *s)
*vpp = vp->next;
ckfree(vp);
INTON;
- } else {
+ } else if (!(flags & VUNSET)) {
setvar(s, 0, 0);
vp->flags &= ~VEXPORT;
}
-ok:
retval = 0;
}