diff options
Diffstat (limited to '')
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | src/var.c | 8 |
2 files changed, 7 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog index 7285a23..f3c7701 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2010-05-25 Herbert Xu <herbert@gondor.apana.org.au> + + * Fix poplocalvar leak. + 2010-05-24 Herbert Xu <herbert@gondor.apana.org.au> * Add localvars nesting. diff --git a/src/var.c b/src/var.c index de1a5f5..fc6d367 100644 --- a/src/var.c +++ b/src/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; } |