mb_strrpos offset is byte count for negative values
| Bug #43841 | mb_strrpos offset is byte count for negative values | ||||
|---|---|---|---|---|---|
| Submitted: | 2008-01-14 16:38 UTC | Modified: | 2009-02-15 07:14 UTC | ||
| From: | jmessa@php.net | Assigned: | hirokawa (profile) | ||
| Status: | Closed | Package: | mbstring related | ||
| PHP Version: | 5.2CVS-2008-01-14 (snap) | OS: | Windows XP | ||
| Private report: | No | CVE-ID: | None | ||
[2008-01-14 16:38 UTC] jmessa@php.net
Description: ------------ The offset argument appears to do a byte count for negative values of offset. In the example below, $string_ascii is 21 characters long and $string_mb is 21 characters (53 bytes) long. In both cases the needle appears twice, first at position 9 and secondly at position 20. When the offset is -24, beyond the character length of the string, it finds $needle at position 9, when $needle would be expected to be found when offest is -12 (i.e. behave the same as the ASCII example). It's also worth noting that strrpos returns a notice when the offset is outside the boundary of the string whereas mb_strrpos does not. This may be linked to this bug: http://bugs.php.net/43840. Reproduce code: --------------- <?php $offsets = array(-25, -24, -13, -12); $string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII='); $needle = base64_decode('44CC'); foreach ($offsets as $i) { echo "\n-- Offset is $i --\n"; echo "Multibyte String:\t"; var_dump( mb_strrpos($string_mb, $needle, $i, 'UTF-8') ); echo "ASCII String:\n"; echo "mb_strrpos:\t\t"; var_dump(mb_strrpos('This is na English ta', 'a', $i)); echo "strrpos:\t\t"; var_dump(strrpos('This is na English ta', 'a', $i)); } ?> Expected result: ---------------- -- Offset is -25 -- Multibyte String: Notice: mb_strrpos(): Offset is greater than the length of haystack string in ...\mb_strrpos.php on line 9 bool(false) ASCII String: mb_strrpos: Notice: mb_strrpos(): Offset is greater than the length of haystack string in ...\mb_strrpos.php on line 14 bool(false) strrpos: Notice: strrpos(): Offset is greater than the length of haystack string in ...\mb_strrpos.php on line 14 bool(false) -- Offset is -24 -- Multibyte String: Notice: mb_strrpos(): Offset is greater than the length of haystack string in ...\mb_strrpos.php on line 9 bool(false) ASCII String: mb_strrpos: Notice: mb_strrpos(): Offset is greater than the length of haystack string in ...\mb_strrpos.php on line 14 bool(false) strrpos: Notice: strrpos(): Offset is greater than the length of haystack string in ...\mb_strrpos.php on line 14 bool(false) -- Offset is -13 -- Multibyte String: bool(false) ASCII String: mb_strrpos: bool(false) strrpos: bool(false) -- Offset is -12 -- Multibyte String: int(9) ASCII String: mb_strrpos: int(9) strrpos: int(9) Actual result: -------------- -- Offset is -25 -- Multibyte String: bool(false) ASCII String: mb_strrpos: bool(false) strrpos: Notice: strrpos(): Offset is greater than the length of haystack string in ...\mb_strrpos.php on line 14 bool(false) -- Offset is -24 -- Multibyte String: int(9) ASCII String: mb_strrpos: bool(false) strrpos: Notice: strrpos(): Offset is greater than the length of haystack string in ...\mb_strrpos.php on line 14 bool(false) -- Offset is -13 -- Multibyte String: int(9) ASCII String: mb_strrpos: bool(false) strrpos: bool(false) -- Offset is -12 -- Multibyte String: int(9) ASCII String: mb_strrpos: int(9) strrpos: int(9)
Patches
Pull Requests
History
AllCommentsChangesGit/SVN commits
[2008-02-10 00:31 UTC] hirokawa@php.net
[2008-02-12 09:51 UTC] jmessa@php.net
[2008-02-12 09:53 UTC] jmessa@php.net
[2008-02-18 14:07 UTC] jmessa@php.net
[2008-02-26 01:00 UTC] php-bugs at lists dot php dot net
[2008-12-05 13:44 UTC] ant@php.net
[2009-02-15 07:14 UTC] moriyoshi@php.net