moriyoshi               Sat Feb 14 07:35:01 2009 UTC

  Added files:                 (Branch: PHP_5_2)
    /php-src/ext/mbstring/tests bug45923.phpt 

  Modified files:              
    /php-src    NEWS 
    /php-src/ext/mbstring       mbstring.c 
    /php-src/ext/mbstring/libmbfl/mbfl  mbfilter.c 
  Log:
  - MFH: Fix Bug #45923 (mb_st[r]ripos() offset not handled correctly)
  
  
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.1417&r2=1.2027.2.547.2.1418&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2027.2.547.2.1417 php-src/NEWS:1.2027.2.547.2.1418
--- php-src/NEWS:1.2027.2.547.2.1417    Fri Feb 13 22:26:46 2009
+++ php-src/NEWS        Sat Feb 14 07:35:00 2009
@@ -1,6 +1,7 @@
 PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? Feb 2009, PHP 5.2.9
+- Fixed Bug #45923 (mb_st[r]ripos() offset not handled correctly). (Moriyoshi)
 
 12 Feb 2009, PHP 5.2.9RC2
 - Fixed bug #47353 (crash when creating a lot of objects in object destructor).
http://cvs.php.net/viewvc.cgi/php-src/ext/mbstring/mbstring.c?r1=1.224.2.22.2.44&r2=1.224.2.22.2.45&diff_format=u
Index: php-src/ext/mbstring/mbstring.c
diff -u php-src/ext/mbstring/mbstring.c:1.224.2.22.2.44 
php-src/ext/mbstring/mbstring.c:1.224.2.22.2.45
--- php-src/ext/mbstring/mbstring.c:1.224.2.22.2.44     Mon Feb  9 15:34:32 2009
+++ php-src/ext/mbstring/mbstring.c     Sat Feb 14 07:35:01 2009
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: mbstring.c,v 1.224.2.22.2.44 2009/02/09 15:34:32 iliaa Exp $ */
+/* $Id: mbstring.c,v 1.224.2.22.2.45 2009/02/14 07:35:01 moriyoshi Exp $ */
 
 /*
  * PHP 4 Multibyte String module "mbstring"
@@ -1653,12 +1653,12 @@
                }
        }
 
-       if (offset < 0 || (unsigned long)offset > (unsigned 
long)mbfl_strlen(&haystack)) {
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset not 
contained in string.");
+       if (offset < 0 || offset > mbfl_strlen(&haystack)) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset not 
contained in string");
                RETURN_FALSE;
        }
        if (needle.len == 0) {
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty delimiter.");
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty delimiter");
                RETURN_FALSE;
        }
 
@@ -1670,17 +1670,17 @@
                case 1:
                        break;
                case 2:
-                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Needle has 
not positive length.");
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Needle has 
not positive length");
                        break;
                case 4:
-                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown 
encoding or conversion error.");
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown 
encoding or conversion error");
                        break;
                case 8:
-                       php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Argument is 
empty.");
+                       php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Argument is 
empty");
                        break;
                default:
-                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown 
error in mb_strpos.");
-                       break;                  
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown 
error in mb_strpos");
+                       break;
                }
                RETVAL_FALSE;
        }
@@ -1767,10 +1767,13 @@
                RETURN_FALSE;
        }
 
-       if ((offset > 0 && offset > mbfl_strlen(&haystack)) ||
-               (offset < 0 && -offset > mbfl_strlen(&haystack))) {
-               php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Offset is greater 
than the length of haystack string");
-               RETURN_FALSE;
+       {
+               int haystack_char_len = mbfl_strlen(&haystack);
+               if ((offset > 0 && offset > haystack_char_len) ||
+                       (offset < 0 && -offset > haystack_char_len)) {
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset is 
greater than the length of haystack string");
+                       RETURN_FALSE;
+               }
        }
 
        n = mbfl_strpos(&haystack, &needle, offset, 1);
@@ -1824,10 +1827,6 @@
                RETURN_FALSE;
        }
 
-       if(offset > old_haystack_len){
-               RETURN_FALSE;
-       }
-
        n = php_mb_stripos(1, old_haystack, old_haystack_len, old_needle, 
old_needle_len, offset, from_encoding TSRMLS_CC);
 
        if (n >= 0) {
@@ -1987,7 +1986,7 @@
                RETURN_FALSE;
        }
 
- n = php_mb_stripos(0, haystack.val, haystack.len, needle.val, needle.len, 0, 
from_encoding TSRMLS_CC);
+       n = php_mb_stripos(0, haystack.val, haystack.len, needle.val, 
needle.len, 0, from_encoding TSRMLS_CC);
 
        if (n <0) {
                RETURN_FALSE;
@@ -4310,9 +4309,21 @@
                        break;
                }
 
-               if (offset < 0 || (unsigned long)offset > haystack.len) {
-                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset not 
contained in string.");
-                       break;
+               {
+                       int haystack_char_len = mbfl_strlen(&haystack);
+
+                       if (mode) {
+                               if ((offset > 0 && offset > haystack_char_len) 
||
+                                       (offset < 0 && -offset > 
haystack_char_len)) {
+                                       php_error_docref(NULL TSRMLS_CC, 
E_WARNING, "Offset is greater than the length of haystack string");
+                                       break;
+                               }
+                       } else {
+                               if (offset < 0 || offset > haystack_char_len) {
+                                       php_error_docref(NULL TSRMLS_CC, 
E_WARNING, "Offset not contained in string");
+                                       break;
+                               }
+                       }
                }
 
                n = mbfl_strpos(&haystack, &needle, offset, mode);
@@ -4326,7 +4337,7 @@
                efree(needle.val);
        }
 
- return n;
+       return n;
 }
 /* }}} */
 
http://cvs.php.net/viewvc.cgi/php-src/ext/mbstring/libmbfl/mbfl/mbfilter.c?r1=1.7.2.5.2.3&r2=1.7.2.5.2.4&diff_format=u
Index: php-src/ext/mbstring/libmbfl/mbfl/mbfilter.c
diff -u php-src/ext/mbstring/libmbfl/mbfl/mbfilter.c:1.7.2.5.2.3 
php-src/ext/mbstring/libmbfl/mbfl/mbfilter.c:1.7.2.5.2.4
--- php-src/ext/mbstring/libmbfl/mbfl/mbfilter.c:1.7.2.5.2.3    Fri Feb  6 
08:49:05 2009
+++ php-src/ext/mbstring/libmbfl/mbfl/mbfilter.c        Sat Feb 14 07:35:01 2009
@@ -905,7 +905,7 @@
        }
 
        if (offset < 0) {
-               negative_offset = -offset-1;
+               negative_offset = -offset - pc.needle_len;
                offset = 0;
        }
 

http://cvs.php.net/viewvc.cgi/php-src/ext/mbstring/tests/bug45923.phpt?view=markup&rev=1.1
Index: php-src/ext/mbstring/tests/bug45923.phpt
+++ php-src/ext/mbstring/tests/bug45923.phpt
--TEST--
Bug #45923 (mb_st[r]ripos() offset not handled correctly)
--SKIPIF--
<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
--INI--
mbstring.internal_encoding=UTF-8
--FILE--
<?php
var_dump(strpos("abc abc abc", "abc", 0));
var_dump(strpos("abc abc abc", "abc", 3));
var_dump(strpos("abc abc abc", "abc", 6));
var_dump(strpos("abc abc abc", "abc", 9));
var_dump(strpos("abc abc abc", "abc", 11));
var_dump(strpos("abc abc abc", "abc", 12));
var_dump(strpos("abc abc abc", "abc", -1));
var_dump(strpos("abc abc abc", "abc", -3));
var_dump(strpos("abc abc abc", "abc", -6));

var_dump(mb_strpos("●○◆ ●○◆ ●○◆", "●○◆", 0));
var_dump(mb_strpos("●○◆ ●○◆ ●○◆", "●○◆", 3));
var_dump(mb_strpos("●○◆ ●○◆ ●○◆", "●○◆", 6));
var_dump(mb_strpos("●○◆ ●○◆ ●○◆", "●○◆", 9));
var_dump(mb_strpos("●○◆ ●○◆ ●○◆", "●○◆", 11));
var_dump(mb_strpos("●○◆ ●○◆ ●○◆", "●○◆", 12));
var_dump(mb_strpos("●○◆ ●○◆ ●○◆", "●○◆", -1));
var_dump(mb_strpos("●○◆ ●○◆ ●○◆", "●○◆", -3));
var_dump(mb_strpos("●○◆ ●○◆ ●○◆", "●○◆", -6));

var_dump(stripos("abc abc abc", "abc", 0));
var_dump(stripos("abc abc abc", "abc", 3));
var_dump(stripos("abc abc abc", "abc", 6));
var_dump(stripos("abc abc abc", "abc", 9));
var_dump(stripos("abc abc abc", "abc", 11));
var_dump(stripos("abc abc abc", "abc", 12));
var_dump(stripos("abc abc abc", "abc", -1));
var_dump(stripos("abc abc abc", "abc", -3));
var_dump(stripos("abc abc abc", "abc", -6));

var_dump(mb_stripos("●○◆ ●○◆ ●○◆", "●○◆", 0));
var_dump(mb_stripos("●○◆ ●○◆ ●○◆", "●○◆", 3));
var_dump(mb_stripos("●○◆ ●○◆ ●○◆", "●○◆", 6));
var_dump(mb_stripos("●○◆ ●○◆ ●○◆", "●○◆", 9));
var_dump(mb_stripos("●○◆ ●○◆ ●○◆", "●○◆", 11));
var_dump(mb_stripos("●○◆ ●○◆ ●○◆", "●○◆", 12));
var_dump(mb_stripos("●○◆ ●○◆ ●○◆", "●○◆", -1));
var_dump(mb_stripos("●○◆ ●○◆ ●○◆", "●○◆", -3));
var_dump(mb_stripos("●○◆ ●○◆ ●○◆", "●○◆", -6));

var_dump(strrpos("abc abc abc", "abc", 0));
var_dump(strrpos("abc abc abc", "abc", 3));
var_dump(strrpos("abc abc abc", "abc", 6));
var_dump(strrpos("abc abc abc", "abc", 9));
var_dump(strrpos("abc abc abc", "abc", 11));
var_dump(strrpos("abc abc abc", "abc", 12));
var_dump(strrpos("abc abc abc", "abc", -1));
var_dump(strrpos("abc abc abc", "abc", -3));
var_dump(strrpos("abc abc abc", "abc", -6));

var_dump(mb_strrpos("●○◆ ●○◆ ●○◆", "●○◆", 0));
var_dump(mb_strrpos("●○◆ ●○◆ ●○◆", "●○◆", 3));
var_dump(mb_strrpos("●○◆ ●○◆ ●○◆", "●○◆", 6));
var_dump(mb_strrpos("●○◆ ●○◆ ●○◆", "●○◆", 9));
var_dump(mb_strrpos("●○◆ ●○◆ ●○◆", "●○◆", 11));
var_dump(mb_strrpos("●○◆ ●○◆ ●○◆", "●○◆", 12));
var_dump(mb_strrpos("●○◆ ●○◆ ●○◆", "●○◆", -1));
var_dump(mb_strrpos("●○◆ ●○◆ ●○◆", "●○◆", -3));
var_dump(mb_strrpos("●○◆ ●○◆ ●○◆", "●○◆", -6));

var_dump(strripos("abc abc abc", "abc", 0));
var_dump(strripos("abc abc abc", "abc", 3));
var_dump(strripos("abc abc abc", "abc", 6));
var_dump(strripos("abc abc abc", "abc", 9));
var_dump(strripos("abc abc abc", "abc", 11));
var_dump(strripos("abc abc abc", "abc", 12));
var_dump(strripos("abc abc abc", "abc", -1));
var_dump(strripos("abc abc abc", "abc", -3));
var_dump(strripos("abc abc abc", "abc", -6));

var_dump(mb_strripos("●○◆ ●○◆ ●○◆", "●○◆", 0));
var_dump(mb_strripos("●○◆ ●○◆ ●○◆", "●○◆", 3));
var_dump(mb_strripos("●○◆ ●○◆ ●○◆", "●○◆", 6));
var_dump(mb_strripos("●○◆ ●○◆ ●○◆", "●○◆", 9));
var_dump(mb_strripos("●○◆ ●○◆ ●○◆", "●○◆", 11));
var_dump(mb_strripos("●○◆ ●○◆ ●○◆", "●○◆", 12));
var_dump(mb_strripos("●○◆ ●○◆ ●○◆", "●○◆", -1));
var_dump(mb_strripos("●○◆ ●○◆ ●○◆", "●○◆", -3));
var_dump(mb_strripos("●○◆ ●○◆ ●○◆", "●○◆", -6));

?>
--EXPECTF--
int(0)
int(4)
int(8)
bool(false)
bool(false)

Warning: strpos(): Offset not contained in string in %s on line %d
bool(false)

Warning: strpos(): Offset not contained in string in %s on line %d
bool(false)

Warning: strpos(): Offset not contained in string in %s on line %d
bool(false)

Warning: strpos(): Offset not contained in string in %s on line %d
bool(false)
int(0)
int(4)
int(8)
bool(false)
bool(false)

Warning: mb_strpos(): Offset not contained in string in %s on line %d
bool(false)

Warning: mb_strpos(): Offset not contained in string in %s on line %d
bool(false)

Warning: mb_strpos(): Offset not contained in string in %s on line %d
bool(false)

Warning: mb_strpos(): Offset not contained in string in %s on line %d
bool(false)
int(0)
int(4)
int(8)
bool(false)
bool(false)

Warning: stripos(): Offset not contained in string in %s on line %d
bool(false)

Warning: stripos(): Offset not contained in string in %s on line %d
bool(false)

Warning: stripos(): Offset not contained in string in %s on line %d
bool(false)

Warning: stripos(): Offset not contained in string in %s on line %d
bool(false)
int(0)
int(4)
int(8)
bool(false)
bool(false)

Warning: mb_stripos(): Offset not contained in string in %s on line %d
bool(false)

Warning: mb_stripos(): Offset not contained in string in %s on line %d
bool(false)

Warning: mb_stripos(): Offset not contained in string in %s on line %d
bool(false)

Warning: mb_stripos(): Offset not contained in string in %s on line %d
bool(false)
int(8)
int(8)
int(8)
bool(false)
bool(false)

Warning: strrpos(): Offset is greater than the length of haystack string in %s 
on line %d
bool(false)
int(8)
int(8)
int(4)
int(8)
int(8)
int(8)
bool(false)
bool(false)

Warning: mb_strrpos(): Offset is greater than the length of haystack string in 
%s on line %d
bool(false)
int(8)
int(8)
int(4)
int(8)
int(8)
int(8)
bool(false)
bool(false)

Warning: strripos(): Offset is greater than the length of haystack string in %s 
on line %d
bool(false)
int(8)
int(8)
int(4)
int(8)
int(8)
int(8)
bool(false)
bool(false)

Warning: mb_strripos(): Offset is greater than the length of haystack string in 
%s on line %d
bool(false)
int(8)
int(8)
int(4)

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

Reply via email to