Author: nbd
Date: 2015-04-17 02:01:29 +0200 (Fri, 17 Apr 2015)
New Revision: 45471

Added:
   
trunk/package/utils/busybox/patches/290-ash-fix-a-regression-in-handling-local-variables.patch
Log:
busybox: fix an ash regression in handling local variables

Signed-off-by: Felix Fietkau <[email protected]>

Added: 
trunk/package/utils/busybox/patches/290-ash-fix-a-regression-in-handling-local-variables.patch
===================================================================
--- 
trunk/package/utils/busybox/patches/290-ash-fix-a-regression-in-handling-local-variables.patch
                              (rev 0)
+++ 
trunk/package/utils/busybox/patches/290-ash-fix-a-regression-in-handling-local-variables.patch
      2015-04-17 00:01:29 UTC (rev 45471)
@@ -0,0 +1,75 @@
+From: Felix Fietkau <[email protected]>
+Date: Fri, 17 Apr 2015 01:54:51 +0200
+Subject: [PATCH] ash: fix a regression in handling local variables
+
+commit 109ee5d33694a03cda3424b4846584250832ba8e
+"ash: make "locak VAR" unset VAR (bash does that)"
+
+This commit introduced a regression where calling local on an already
+local variable unsets it. This does not match bash behavior.
+
+Update test case to check for this behavior
+
+Signed-off-by: Felix Fietkau <[email protected]>
+---
+
+--- a/shell/ash.c
++++ b/shell/ash.c
+@@ -8961,6 +8961,21 @@ parse_command_args(char **argv, const ch
+ }
+ #endif
+ 
++static bool
++findlocal(struct var *vp)
++{
++      struct localvar *lvp = localvars;
++
++      while (lvp) {
++              if (lvp->vp == vp)
++                      return true;
++
++              lvp = lvp->next;
++      }
++
++      return false;
++}
++
+ /*
+  * Make a variable a local variable.  When a variable is made local, it's
+  * value and flags are saved in a localvar structure.  The saved values
+@@ -9000,7 +9015,7 @@ mklocal(char *name)
+                       vp->flags |= VSTRFIXED|VTEXTFIXED;
+                       if (eq)
+                               setvareq(name, 0);
+-                      else
++                      else if (!findlocal(vp))
+                               /* "local VAR" unsets VAR: */
+                               setvar(name, NULL, 0);
+               }
+--- a/shell/ash_test/ash-misc/local1.right
++++ b/shell/ash_test/ash-misc/local1.right
+@@ -1,4 +1,5 @@
+ A1:'A'
+ A2:''
+-A3:''
+-A4:'A'
++A3:'B'
++A4:''
++A5:'A'
+--- a/shell/ash_test/ash-misc/local1.tests
++++ b/shell/ash_test/ash-misc/local1.tests
+@@ -3,9 +3,12 @@ f() {
+       local a
+       # the above line unsets $a
+       echo "A2:'$a'"
+-      unset a
++      a=B
++      local a
+       echo "A3:'$a'"
++      unset a
++      echo "A4:'$a'"
+ }
+ echo "A1:'$a'"
+ f
+-echo "A4:'$a'"
++echo "A5:'$a'"
_______________________________________________
openwrt-commits mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-commits

Reply via email to