u_e = haystack.u + haystack_len - needle_len;
} else {
u_p = haystack.u;
- if (-offset > haystack_len) {
+ if (-offset > haystack_len || -offset < 0) {
RETURN_FALSE;
} else {
cu_offset = haystack_len;
e = haystack.s + haystack_len - 1;
} else {
p = haystack.s;
- if (-offset > haystack_len) {
+ if (-offset > haystack_len || -offset < 0) {
RETURN_FALSE;
} else {
e = haystack.s + haystack_len + offset;
p = haystack_dup + offset;
e = haystack_dup + haystack_len - needle_len;
} else {
- if (-offset > haystack_len) {
+ if (-offset > haystack_len || -offset < 0) {
efree(haystack_dup);
efree(needle_dup);
RETURN_FALSE;
--- /dev/null
+--TEST--
+strripos() offset integer overflow
+--FILE--
+<?php
+
+var_dump(strripos("t", "t", PHP_INT_MAX+1));
+var_dump(strripos("tttt", "tt", PHP_INT_MAX+1));
+var_dump(strripos(100, 101, PHP_INT_MAX+1));
+var_dump(strripos(1024, 1024, PHP_INT_MAX+1));
+var_dump(strripos(array(), array(), PHP_INT_MAX+1));
+var_dump(strripos(1024, 1024, -PHP_INT_MAX));
+var_dump(strripos(1024, "te", -PHP_INT_MAX));
+var_dump(strripos(1024, 1024, -PHP_INT_MAX-1));
+var_dump(strripos(1024, "te", -PHP_INT_MAX-1));
+
+echo "Done\n";
+?>
+--EXPECTF--
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+
+Warning: strripos() expects parameter 1 to be string (Unicode or binary), array given in %s on line %d
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+Done
+--UEXPECTF--
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+
+Warning: strripos() expects parameter 1 to be string (Unicode or binary), array given in %s on line %d
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+Done