moriyoshi                                Wed, 23 Sep 2009 15:22:47 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=288613

Log:
- Fixed bug #49354 (mb_strcut() cuts wrong length when offset is within a
  multibyte character).

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

Bug: http://bugs.php.net/49354 (Assigned) mb_strcut() cutting wrong length when 
offset is within a multibyte character
      
Changed paths:
    U   php/php-src/branches/PHP_5_2/NEWS
    U   php/php-src/branches/PHP_5_2/ext/mbstring/mbstring.c
    A   php/php-src/branches/PHP_5_2/ext/mbstring/tests/bug49354.phpt
    U   php/php-src/branches/PHP_5_3/ext/mbstring/mbstring.c
    A   php/php-src/branches/PHP_5_3/ext/mbstring/tests/bug49354.phpt
    U   php/php-src/trunk/ext/mbstring/mbstring.c
    A   php/php-src/trunk/ext/mbstring/tests/bug49354.phpt

Modified: php/php-src/branches/PHP_5_2/NEWS
===================================================================
--- php/php-src/branches/PHP_5_2/NEWS   2009-09-23 14:26:51 UTC (rev 288612)
+++ php/php-src/branches/PHP_5_2/NEWS   2009-09-23 15:22:47 UTC (rev 288613)
@@ -7,6 +7,8 @@
   mbstring.strict_mode is turned on). (Moriyoshi)
 - Fixed bug #49531 (CURLOPT_INFILESIZE sometimes causes warning "CURLPROTO_FILE
   cannot be set"). (Felipe)
+- Fixed bug #49354 (mb_strcut() cuts wrong length when offset is in the middle
+  of a multibyte character). (Moriyoshi)
 - Fixed bug #49528 (UTF-16 strings prefixed by BOMs wrondly converted).
   (Moriyoshi)


Modified: php/php-src/branches/PHP_5_2/ext/mbstring/mbstring.c
===================================================================
--- php/php-src/branches/PHP_5_2/ext/mbstring/mbstring.c        2009-09-23 
14:26:51 UTC (rev 288612)
+++ php/php-src/branches/PHP_5_2/ext/mbstring/mbstring.c        2009-09-23 
15:22:47 UTC (rev 288613)
@@ -2272,9 +2272,6 @@
        if (from > Z_STRLEN_PP(arg1)) {
                RETURN_FALSE;
        }
-       if (((unsigned) from + (unsigned) len) > Z_STRLEN_PP(arg1)) {
-               len = Z_STRLEN_PP(arg1) - from;
-       }

        ret = mbfl_strcut(&string, &result, from, len);
        if (ret != NULL) {

Added: php/php-src/branches/PHP_5_2/ext/mbstring/tests/bug49354.phpt
===================================================================
--- php/php-src/branches/PHP_5_2/ext/mbstring/tests/bug49354.phpt               
                (rev 0)
+++ php/php-src/branches/PHP_5_2/ext/mbstring/tests/bug49354.phpt       
2009-09-23 15:22:47 UTC (rev 288613)
@@ -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)

Modified: php/php-src/branches/PHP_5_3/ext/mbstring/mbstring.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/mbstring/mbstring.c        2009-09-23 
14:26:51 UTC (rev 288612)
+++ php/php-src/branches/PHP_5_3/ext/mbstring/mbstring.c        2009-09-23 
15:22:47 UTC (rev 288613)
@@ -2665,10 +2665,6 @@
                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;

Added: php/php-src/branches/PHP_5_3/ext/mbstring/tests/bug49354.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/mbstring/tests/bug49354.phpt               
                (rev 0)
+++ php/php-src/branches/PHP_5_3/ext/mbstring/tests/bug49354.phpt       
2009-09-23 15:22:47 UTC (rev 288613)
@@ -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)

Modified: php/php-src/trunk/ext/mbstring/mbstring.c
===================================================================
--- php/php-src/trunk/ext/mbstring/mbstring.c   2009-09-23 14:26:51 UTC (rev 
288612)
+++ php/php-src/trunk/ext/mbstring/mbstring.c   2009-09-23 15:22:47 UTC (rev 
288613)
@@ -2664,10 +2664,6 @@
                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;

Added: php/php-src/trunk/ext/mbstring/tests/bug49354.phpt
===================================================================
--- php/php-src/trunk/ext/mbstring/tests/bug49354.phpt                          
(rev 0)
+++ php/php-src/trunk/ext/mbstring/tests/bug49354.phpt  2009-09-23 15:22:47 UTC 
(rev 288613)
@@ -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)

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to