diff options
author | Ron Yorston <rmy@pobox.com> | 2016-03-18 11:29:19 +0000 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2016-03-22 18:19:29 -0400 |
commit | 3e3bfb896e0dd8a54caad9c6264e2452566b4012 (patch) | |
tree | cf13a882acb6060341acf3bfa3f9a54c3d7d43cb | |
parent | 6701e91d84fe499b5d87dc21790cd9d7bcb13220 (diff) | |
download | busybox-w32-3e3bfb896e0dd8a54caad9c6264e2452566b4012.tar.gz busybox-w32-3e3bfb896e0dd8a54caad9c6264e2452566b4012.tar.bz2 busybox-w32-3e3bfb896e0dd8a54caad9c6264e2452566b4012.zip |
ash: fix corruption of ${#var} if $var contains UTF-8 characters
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@inlv.org>
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
-rw-r--r-- | shell/ash.c | 2 | ||||
-rw-r--r-- | shell/ash_test/ash-vars/var-utf8-length.right | 1 | ||||
-rwxr-xr-x | shell/ash_test/ash-vars/var-utf8-length.tests | 2 |
3 files changed, 5 insertions, 0 deletions
diff --git a/shell/ash.c b/shell/ash.c index b5a2d961d..5613e1f33 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) | |||
6692 | if (subtype == VSLENGTH && len > 0) { | 6692 | if (subtype == VSLENGTH && len > 0) { |
6693 | reinit_unicode_for_ash(); | 6693 | reinit_unicode_for_ash(); |
6694 | if (unicode_status == UNICODE_ON) { | 6694 | if (unicode_status == UNICODE_ON) { |
6695 | STADJUST(-len, expdest); | ||
6696 | discard = 0; | ||
6695 | len = unicode_strlen(p); | 6697 | len = unicode_strlen(p); |
6696 | } | 6698 | } |
6697 | } | 6699 | } |
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 000000000..6f4247a62 --- /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 000000000..d04b2cbb6 --- /dev/null +++ b/shell/ash_test/ash-vars/var-utf8-length.tests | |||
@@ -0,0 +1,2 @@ | |||
1 | X=abcdÉfghÍjklmnÓpqrstÚvwcyz | ||
2 | echo ${#X} | ||