diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2010-05-25 18:14:32 +0800 |
---|---|---|
committer | maximilian attems <max@stro.at> | 2011-06-03 18:04:48 +0200 |
commit | 6aacbff0ba1523aa8272340ec14aacde4a649bc8 (patch) | |
tree | b94e59b1d2c150035a59f76700cbf6d32746e7a5 | |
parent | 85712e2d1287222f27f470e04cf49394cfdcf81f (diff) | |
download | klibc-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.c | 8 |
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; } |