diff options
author | Felix Fietkau <nbd@openwrt.org> | 2015-04-17 00:01:29 +0000 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2015-04-17 00:01:29 +0000 |
commit | c1bf2d22df1d5e09af60ff115cfcc0126bff79de (patch) | |
tree | 21abab6ca7fb366b72ad0d96f20fe9b9585af5b0 /package | |
parent | 2d981de1e7aba6ccaedfad3c656caf00d4fee179 (diff) | |
download | master-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')
-rw-r--r-- | package/utils/busybox/patches/290-ash-fix-a-regression-in-handling-local-variables.patch | 75 |
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'" |