ash: [VAR] Fix poplocalvar leak
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 26 Jul 2017 17:25:40 +0000 (19:25 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 26 Jul 2017 18:33:51 +0000 (20:33 +0200)
Upstream commit:

    Date: Tue, 25 May 2010 18:14:32 +0800
    [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: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash.c

index 8bef78546bda573d5a9fc4fc88ef94790b2fb77f..75a72ea0cdc4043d93846f52b44fff377a0aaa6c 100644 (file)
@@ -9200,7 +9200,8 @@ poplocalvars(void)
                        memcpy(optlist, lvp->text, sizeof(optlist));
                        free((char*)lvp->text);
                        optschanged();
-               } else if ((lvp->flags & (VUNSET|VSTRFIXED)) == VUNSET) {
+               } else if (lvp->flags == VUNSET) {
+                       vp->flags &= ~(VSTRFIXED|VREADONLY);
                        unsetvar(vp->var_text);
                } else {
                        if (vp->var_func)