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.

Reported-by: Martijn Dekker
Signed-off-by: Ron Yorston <[email protected]>
---
 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(+)
 create mode 100644 shell/ash_test/ash-vars/var-utf8-length.right
 create mode 100755 shell/ash_test/ash-vars/var-utf8-length.tests

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}
-- 
2.5.0

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to