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