Skip to content

Commit 5b46bde

Browse files
committed
Merge branch 'PHP-8.0'
* PHP-8.0: Don't throw for out of bounds offsets in strspn()
2 parents 543bcd8 + d776d25 commit 5b46bde

File tree

7 files changed

+5126
-5153
lines changed

7 files changed

+5126
-5153
lines changed

ext/standard/string.c

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -258,22 +258,25 @@ static void php_spn_common_handler(INTERNAL_FUNCTION_PARAMETERS, int behavior) /
258258
Z_PARAM_LONG_OR_NULL(len, len_is_null)
259259
ZEND_PARSE_PARAMETERS_END();
260260

261+
size_t remain_len = ZSTR_LEN(s11);
261262
if (start < 0) {
262-
start += (zend_long)ZSTR_LEN(s11);
263-
}
264-
if (start < 0 || (size_t)start > ZSTR_LEN(s11)) {
265-
zend_argument_value_error(3, "must be contained in argument #1 ($str)");
266-
RETURN_THROWS();
263+
start += remain_len;
264+
if (start < 0) {
265+
start = 0;
266+
}
267+
} else if ((size_t) start > remain_len) {
268+
start = remain_len;
267269
}
268270

269-
size_t remain_len = ZSTR_LEN(s11) - start;
271+
remain_len -= start;
270272
if (!len_is_null) {
271273
if (len < 0) {
272274
len += remain_len;
273-
}
274-
if (len < 0 || (size_t)len > remain_len) {
275-
zend_argument_value_error(4, "must be contained in argument #1 ($str)");
276-
RETURN_THROWS();
275+
if (len < 0) {
276+
len = 0;
277+
}
278+
} else if ((size_t) len > remain_len) {
279+
len = remain_len;
277280
}
278281
} else {
279282
len = remain_len;

ext/standard/tests/strings/bug40754.phpt

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,8 @@ $v = 2147483647;
77

88
var_dump(substr("abcde", 1, $v));
99
var_dump(substr_replace("abcde", "x", $v, $v));
10-
11-
try {
12-
var_dump(strspn("abcde", "abc", $v, $v));
13-
} catch (ValueError $exception) {
14-
echo $exception->getMessage() . "\n";
15-
}
16-
17-
try {
18-
var_dump(strcspn("abcde", "abc", $v, $v));
19-
} catch (ValueError $exception) {
20-
echo $exception->getMessage() . "\n";
21-
}
10+
var_dump(strspn("abcde", "abc", $v, $v));
11+
var_dump(strcspn("abcde", "abc", $v, $v));
2212

2313
try {
2414
var_dump(substr_count("abcde", "abc", $v, $v));
@@ -88,8 +78,8 @@ var_dump(substr("abcde", $v, $v));
8878
--EXPECT--
8979
string(4) "bcde"
9080
string(6) "abcdex"
91-
strspn(): Argument #3 ($offset) must be contained in argument #1 ($str)
92-
strcspn(): Argument #3 ($offset) must be contained in argument #1 ($str)
81+
int(0)
82+
int(0)
9383
substr_count(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
9484
substr_compare(): Argument #3 ($offset) must be contained in argument #1 ($main_str)
9585
stripos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)

ext/standard/tests/strings/strcspn.phpt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,12 @@ var_dump($b);
99
var_dump(strcspn($a,$b));
1010
var_dump(strcspn($a,$b,9));
1111
var_dump(strcspn($a,$b,9,6));
12-
try {
13-
var_dump(strcspn('a', 'B', 1, 2147483647));
14-
} catch (ValueError $e) {
15-
echo $e->getMessage(), "\n";
16-
}
12+
var_dump(strcspn('a', 'B', 1, 2147483647));
1713
?>
1814
--EXPECT--
1915
string(25) "22222222aaaa bbb1111 cccc"
2016
string(4) "1234"
2117
int(0)
2218
int(7)
2319
int(6)
24-
strcspn(): Argument #4 ($length) must be contained in argument #1 ($str)
20+
int(0)

0 commit comments

Comments
 (0)