]> granicus.if.org Git - php/commitdiff
- Fixed bug #49354 (mb_strcut() cuts wrong length when offset is within a
authorMoriyoshi Koizumi <moriyoshi@php.net>
Wed, 23 Sep 2009 15:22:47 +0000 (15:22 +0000)
committerMoriyoshi Koizumi <moriyoshi@php.net>
Wed, 23 Sep 2009 15:22:47 +0000 (15:22 +0000)
  multibyte character).

(This bug was introduced by the commit by r202895. Please double-check the
 specification of the function you are going to *fix*.)

ext/mbstring/mbstring.c
ext/mbstring/tests/bug49354.phpt [new file with mode: 0644]

index 4182425170452b65e32c8f64813ca1be12dbcf38..92f2db61b3b25f0f0dc271e9d49ff86031f54b87 100644 (file)
@@ -2665,10 +2665,6 @@ PHP_FUNCTION(mb_strcut)
                RETURN_FALSE;
        }
 
-       if (((unsigned int)from + (unsigned int)len) > string.len) {
-               len = string.len - from;
-       }
-
        ret = mbfl_strcut(&string, &result, from, len);
        if (ret == NULL) {
                RETURN_FALSE;
diff --git a/ext/mbstring/tests/bug49354.phpt b/ext/mbstring/tests/bug49354.phpt
new file mode 100644 (file)
index 0000000..c25b405
--- /dev/null
@@ -0,0 +1,21 @@
+--TEST--
+Bug #49354 (mb_strcut() cuts wrong length when offset is in the middle of a multibyte character)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+$crap = 'AåBäCöDü';
+var_dump(mb_strcut($crap, 0, 100, 'UTF-8'));
+var_dump(mb_strcut($crap, 1, 100, 'UTF-8'));
+var_dump(mb_strcut($crap, 2, 100, 'UTF-8'));
+var_dump(mb_strcut($crap, 3, 100, 'UTF-8'));
+var_dump(mb_strcut($crap, 12, 100, 'UTF-8'));
+var_dump(mb_strcut($crap, 13, 100, 'UTF-8'));
+?>
+--EXPECT--
+string(12) "AåBäCöDü"
+string(11) "åBäCöDü"
+string(11) "åBäCöDü"
+string(9) "BäCöDü"
+string(0) ""
+bool(false)