]> granicus.if.org Git - php/commitdiff
MFH: Fix inconcistencies between substr and substr_compare
authorEtienne Kneuss <colder@php.net>
Wed, 13 Feb 2008 17:02:16 +0000 (17:02 +0000)
committerEtienne Kneuss <colder@php.net>
Wed, 13 Feb 2008 17:02:16 +0000 (17:02 +0000)
ext/standard/string.c
ext/standard/tests/strings/substr.phpt
ext/standard/tests/strings/substr_compare.phpt

index 89298eb4420b0cdd29197f8d93fcd3e1e7719cd7..2cf1f43ebdc81aafd536d2f278aa12c294a75f5a 100644 (file)
@@ -2172,8 +2172,10 @@ PHP_FUNCTION(substr)
        }
        
        f = Z_LVAL_PP(from);
-       if (f > Z_STRLEN_PP(str) || (f < 0 && -f > Z_STRLEN_PP(str))) {
+       if (f > Z_STRLEN_PP(str)) {
                RETURN_FALSE;
+       } else if (f < 0 && -f > Z_STRLEN_PP(str)) {
+               f = 0;
        }
 
        if (l < 0 && (l + Z_STRLEN_PP(str) - f) < 0) {
@@ -5245,14 +5247,13 @@ PHP_FUNCTION(substr_compare)
                offset = (offset < 0) ? 0 : offset;
        }
 
-       if (offset > s1_len) {
+       if (offset >= s1_len) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "The start position cannot exceed initial string length");
                RETURN_FALSE;
        }
 
        if (len > s1_len - offset) {
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "The length cannot exceed initial string length");
-               RETURN_FALSE;
+               len = s1_len - offset;
        }
 
        cmp_len = (uint) (len ? len : MAX(s2_len, (s1_len - offset)));
index b43244e4c8ebcbc550ed3bb6f20d170435805da1..c6366d2ceea4a733e9b16cce5df29a02b2e19537 100644 (file)
Binary files a/ext/standard/tests/strings/substr.phpt and b/ext/standard/tests/strings/substr.phpt differ
index 66a82a87833af4e9134438c49e2e5b7891179ae2..206ccd5edea0183f99f317d599e40a7f2c7ac943 100644 (file)
@@ -9,6 +9,7 @@ var_dump(substr_compare("abcde", "BC", 1, 2, true));
 var_dump(substr_compare("abcde", "bc", 1, 3));
 var_dump(substr_compare("abcde", "cd", 1, 2));
 var_dump(substr_compare("abcde", "abc", 5, 1));
+var_dump(substr_compare("abcde", "abcdef", -10, 10));
 
 var_dump(substr_compare("abcde", -1, 0, NULL, new stdClass));
 echo "Test\n";
@@ -24,8 +25,9 @@ int(0)
 int(1)
 int(-1)
 
-Warning: substr_compare(): The length cannot exceed initial string length in %s on line %d
+Warning: substr_compare(): The start position cannot exceed initial string length in %s on line %d
 bool(false)
+int(0)
 
 Warning: substr_compare() expects parameter 5 to be boolean, object given in %s on line %d
 bool(false)