}
}
- if (offset < 0 || (unsigned long)offset > haystack.len) {
- 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) {
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;
}
if (needle.len <= 0) {
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);
if (n >= 0) {
RETVAL_LONG(n);
RETURN_FALSE;
}
- if ((unsigned int)offset > haystack.len) {
- RETURN_FALSE;
- }
-
n = php_mb_stripos(1, (char *)haystack.val, haystack.len, (char *)needle.val, needle.len, offset, from_encoding TSRMLS_CC);
if (n >= 0) {
/* {{{ MBSTRING_API int php_mb_stripos()
*/
-MBSTRING_API int php_mb_stripos(int mode, const char *old_haystack, unsigned int old_haystack_len, const char *old_needle, unsigned int old_needle_len, unsigned int offset, const char *from_encoding TSRMLS_DC)
+MBSTRING_API int php_mb_stripos(int mode, const char *old_haystack, unsigned int old_haystack_len, const char *old_needle, unsigned int old_needle_len, long offset, const char *from_encoding TSRMLS_DC)
{
int n;
mbfl_string haystack, needle;
break;
}
- if (offset < 0 || 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);
--- /dev/null
+--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)