Skip to content

Commit f022261

Browse files
committed
Fix mb_ereg_search_getregs() NULL pointer dereference
1 parent 3053a03 commit f022261

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

ext/mbstring/php_mbregex.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1535,7 +1535,7 @@ PHP_FUNCTION(mb_ereg_search_getregs)
15351535
add_index_bool(return_value, i, 0);
15361536
}
15371537
}
1538-
if (onig_number_of_names(MBREX(search_re)) > 0) {
1538+
if (MBREX(search_re) != NULL && onig_number_of_names(MBREX(search_re)) > 0) {
15391539
mb_regex_groups_iter_args args = {
15401540
return_value,
15411541
Z_STRVAL(MBREX(search_str)),
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
GH-21036 (mb_ereg_search_getregs() crash after mb_eregi() invalidates search_re)
3+
--CREDITS--
4+
vi3tL0u1s
5+
--EXTENSIONS--
6+
mbstring
7+
--SKIPIF--
8+
<?php
9+
if (!function_exists("mb_ereg_search_init")) die("skip mb_ereg_search_init() not available");
10+
?>
11+
--FILE--
12+
<?php
13+
// mb_eregi() can invalidate MBREX(search_re) via regex cache eviction
14+
// while MBREX(search_regs) remains valid, causing NULL pointer dereference
15+
16+
mb_ereg_search_init("a", "a");
17+
mb_ereg_search_pos();
18+
mb_eregi("a", "a"); // This invalidates search_re
19+
$result = mb_ereg_search_getregs(); // Should not crash
20+
var_dump($result);
21+
?>
22+
--EXPECT--
23+
array(1) {
24+
[0]=>
25+
string(1) "a"
26+
}

0 commit comments

Comments
 (0)