Commit 03a71535c30 for php.net
commit 03a71535c30a441868fcd82256710041b5ce42d2
Author: Matthias Goergens <matthias.goergens@gmail.com>
Date: Thu Jul 30 17:40:32 2026 +0800
Fix mbregex search state after cache invalidation
Closes GH-22954
diff --git a/NEWS b/NEWS
index 4364d69650e..46adc0e74d1 100644
--- a/NEWS
+++ b/NEWS
@@ -91,6 +91,8 @@ PHP NEWS
- MBString:
. Fixed bug GH-22779 (mb_strrpos() returns the wrong position for a negative
offset in a non-UTF-8 encoding). (Eyüp Can Akman)
+ . Fixed bug GH-21036 (mb_ereg_search_getregs() crashes after mb_eregi()
+ invalidates the regex cache). (Matthias Goergens)
- Sockets:
. Fixed socket_set_option() validation error messages for UDP_SEGMENT and
diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c
index 1043c4a46eb..47297a9b15c 100644
--- a/ext/mbstring/php_mbregex.c
+++ b/ext/mbstring/php_mbregex.c
@@ -479,6 +479,10 @@ static php_mb_regex_t *php_mbregex_compile_pattern(const char *pattern, size_t p
if (rc == MBREX(search_re)) {
/* reuse the new rc? see bug #72399 */
MBREX(search_re) = NULL;
+ if (MBREX(search_regs) != NULL) {
+ onig_region_free(MBREX(search_regs), 1);
+ MBREX(search_regs) = NULL;
+ }
}
zend_hash_str_update_ptr(&MBREX(ht_rc), (char *)pattern, patlen, retval);
} else {
diff --git a/ext/mbstring/tests/gh21036.phpt b/ext/mbstring/tests/gh21036.phpt
new file mode 100644
index 00000000000..60c63038510
--- /dev/null
+++ b/ext/mbstring/tests/gh21036.phpt
@@ -0,0 +1,17 @@
+--TEST--
+GH-21036 (mb_ereg_search_getregs() after regex cache invalidation)
+--EXTENSIONS--
+mbstring
+--FILE--
+<?php
+error_reporting(E_ALL & ~E_DEPRECATED);
+
+$pattern = '(?<name>a)';
+mb_ereg_search_init('a', $pattern);
+mb_ereg_search_pos();
+mb_eregi($pattern, 'a');
+
+var_dump(mb_ereg_search_getregs());
+?>
+--EXPECT--
+bool(false)