From 12bd169f24ed5a47c65626af418a2414e9ea4da3 Mon Sep 17 00:00:00 2001 From: Etienne Kneuss Date: Wed, 13 Feb 2008 17:02:16 +0000 Subject: [PATCH] MFH: Fix inconcistencies between substr and substr_compare --- ext/standard/string.c | 9 +++++---- ext/standard/tests/strings/substr.phpt | Bin 4536 -> 4706 bytes .../tests/strings/substr_compare.phpt | 4 +++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 89298eb442..2cf1f43ebd 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -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))); diff --git a/ext/standard/tests/strings/substr.phpt b/ext/standard/tests/strings/substr.phpt index b43244e4c8ebcbc550ed3bb6f20d170435805da1..c6366d2ceea4a733e9b16cce5df29a02b2e19537 100644 GIT binary patch delta 165 zcmdm?{77ZP3XVW7eJzFJlEk7C1sekeH8llY2**w#Cp9mTmV6A1;YRU diff --git a/ext/standard/tests/strings/substr_compare.phpt b/ext/standard/tests/strings/substr_compare.phpt index 66a82a8783..206ccd5ede 100644 --- a/ext/standard/tests/strings/substr_compare.phpt +++ b/ext/standard/tests/strings/substr_compare.phpt @@ -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) -- 2.40.0