[git commit] ash: fix corruption of ${#var} if $var contains UTF-8 characters
Mike Frysinger
vapier at gentoo.org
Tue Mar 22 22:19:29 UTC 2016
commit: https://git.busybox.net/busybox/commit/?id=3e3bfb896e0dd8a54caad9c6264e2452566b4012
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master
As reported in bug 8506:
$ X=abcdÃfghÃjklmnÃpqrstÃvwcyz
$ echo ${#X}
abcd26
The result should be 26.
This regression was introduced by:
<d68d1fb> 2015-05-18 [Ron Yorston] ash: code shrink around varvalue
The length in characters was being used to discard the contents of
the variable instead of the length in bytes.
URL: https://bugs.busybox.net/8506
Reported-by: Martijn Dekker <martijn at inlv.org>
Signed-off-by: Ron Yorston <rmy at pobox.com>
Signed-off-by: Mike Frysinger <vapier at gentoo.org>
---
shell/ash.c | 2 ++
shell/ash_test/ash-vars/var-utf8-length.right | 1 +
shell/ash_test/ash-vars/var-utf8-length.tests | 2 ++
3 files changed, 5 insertions(+)
diff --git a/shell/ash.c b/shell/ash.c
index b5a2d96..5613e1f 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -6692,6 +6692,8 @@ varvalue(char *name, int varflags, int flags, struct strlist *var_str_list)
if (subtype == VSLENGTH && len > 0) {
reinit_unicode_for_ash();
if (unicode_status == UNICODE_ON) {
+ STADJUST(-len, expdest);
+ discard = 0;
len = unicode_strlen(p);
}
}
diff --git a/shell/ash_test/ash-vars/var-utf8-length.right b/shell/ash_test/ash-vars/var-utf8-length.right
new file mode 100644
index 0000000..6f4247a
--- /dev/null
+++ b/shell/ash_test/ash-vars/var-utf8-length.right
@@ -0,0 +1 @@
+26
diff --git a/shell/ash_test/ash-vars/var-utf8-length.tests b/shell/ash_test/ash-vars/var-utf8-length.tests
new file mode 100755
index 0000000..d04b2cb
--- /dev/null
+++ b/shell/ash_test/ash-vars/var-utf8-length.tests
@@ -0,0 +1,2 @@
+X=abcdÃfghÃjklmnÃpqrstÃvwcyz
+echo ${#X}
More information about the busybox-cvs
mailing list