]> granicus.if.org Git - php/commitdiff
MFH: Fix integer oveflow in strrpos()
authorScott MacVicar <scottmac@php.net>
Tue, 22 Jul 2008 01:10:58 +0000 (01:10 +0000)
committerScott MacVicar <scottmac@php.net>
Tue, 22 Jul 2008 01:10:58 +0000 (01:10 +0000)
ext/standard/string.c
ext/standard/tests/strings/strrpos_offset.phpt [new file with mode: 0644]

index 9930110624c1c92ba963c8cc8cacc4469604b281..3d6dabfe7a57a92d30aeb4efa58739a88f371362 100644 (file)
@@ -1842,7 +1842,7 @@ PHP_FUNCTION(strrpos)
                p = haystack + offset;
                e = haystack + haystack_len - needle_len;
        } else {
-               if (-offset > haystack_len) {
+               if (-offset > haystack_len || offset < -INT_MAX) {
                        php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Offset is greater than the length of haystack string");
                        RETURN_FALSE;
                }
diff --git a/ext/standard/tests/strings/strrpos_offset.phpt b/ext/standard/tests/strings/strrpos_offset.phpt
new file mode 100644 (file)
index 0000000..6d641ab
--- /dev/null
@@ -0,0 +1,41 @@
+--TEST--
+strrpos() offset integer overflow
+--FILE--
+<?php
+
+var_dump(strrpos("t", "t", PHP_INT_MAX+1));
+var_dump(strrpos("tttt", "tt", PHP_INT_MAX+1));
+var_dump(strrpos(100, 101, PHP_INT_MAX+1));
+var_dump(strrpos(1024, 1024, PHP_INT_MAX+1));
+var_dump(strrpos(1024, 1024, -PHP_INT_MAX));
+var_dump(strrpos(1024, "te", -PHP_INT_MAX));
+var_dump(strrpos(1024, 1024, -PHP_INT_MAX-1));
+var_dump(strrpos(1024, "te", -PHP_INT_MAX-1));
+
+echo "Done\n";
+?>
+--EXPECTF--    
+Notice: strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+Notice: strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+Notice: strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+Notice: strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+Notice: strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+Notice: strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+Notice: strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+Notice: strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+Done