aboutsummaryrefslogtreecommitdiffstats
path: root/package/utils/busybox
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2015-04-17 00:01:29 +0000
committerFelix Fietkau <nbd@openwrt.org>2015-04-17 00:01:29 +0000
commitc1bf2d22df1d5e09af60ff115cfcc0126bff79de (patch)
tree21abab6ca7fb366b72ad0d96f20fe9b9585af5b0 /package/utils/busybox
parent2d981de1e7aba6ccaedfad3c656caf00d4fee179 (diff)
downloadmaster-187ad058-c1bf2d22df1d5e09af60ff115cfcc0126bff79de.tar.gz
master-187ad058-c1bf2d22df1d5e09af60ff115cfcc0126bff79de.tar.bz2
master-187ad058-c1bf2d22df1d5e09af60ff115cfcc0126bff79de.zip
busybox: fix an ash regression in handling local variables
Signed-off-by: Felix Fietkau <nbd@openwrt.org> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@45471 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/utils/busybox')
-rw-r--r--package/utils/busybox/patches/290-ash-fix-a-regression-in-handling-local-variables.patch75
1 files changed, 75 insertions, 0 deletions
diff --git a/package/utils/busybox/patches/290-ash-fix-a-regression-in-handling-local-variables.patch b/package/utils/busybox/patches/290-ash-fix-a-regression-in-handling-local-variables.patch
new file mode 100644
index 0000000000..0ac1925f3d
--- /dev/null
+++ b/package/utils/busybox/patches/290-ash-fix-a-regression-in-handling-local-variables.patch
@@ -0,0 +1,75 @@
+From: Felix Fietkau <nbd@openwrt.org>
+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 <nbd@openwrt.org>
+---
+
+--- 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'"