Skip to content

Commit 392ad20

Browse files
committed
Fix use of mb_ereg_search_getregs() after invalid pattern
This segfaulted because we assumed that if there are matches, there must be a regular expression as well.
1 parent 136f51f commit 392ad20

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

ext/mbstring/php_mbregex.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1426,6 +1426,11 @@ _php_mb_regex_ereg_search_exec(INTERNAL_FUNCTION_PARAMETERS, int mode)
14261426
_php_mb_regex_init_options(arg_options, arg_options_len, &option, &syntax, NULL);
14271427
}
14281428

1429+
if (MBREX(search_regs)) {
1430+
onig_region_free(MBREX(search_regs), 1);
1431+
MBREX(search_regs) = NULL;
1432+
}
1433+
14291434
if (arg_pattern) {
14301435
/* create regex pattern buffer */
14311436
if ((MBREX(search_re) = php_mbregex_compile_pattern(arg_pattern, arg_pattern_len, option, MBREX(current_mbctype), MBREX(regex_default_syntax))) == NULL) {
@@ -1451,9 +1456,6 @@ _php_mb_regex_ereg_search_exec(INTERNAL_FUNCTION_PARAMETERS, int mode)
14511456
RETURN_FALSE;
14521457
}
14531458

1454-
if (MBREX(search_regs)) {
1455-
onig_region_free(MBREX(search_regs), 1);
1456-
}
14571459
MBREX(search_regs) = onig_region_new();
14581460

14591461
err = _php_mb_onig_search(MBREX(search_re), str, str + len, str + pos, str + len, MBREX(search_regs), 0);
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
--TEST--
2+
mb_ereg_search() with invalid pattern should discard old matches
3+
--FILE--
4+
<?php
5+
6+
mb_ereg_search_init('');
7+
var_dump(mb_ereg_search(''));
8+
var_dump(mb_ereg_search("\xff"));
9+
var_dump(mb_ereg_search_getregs());
10+
11+
?>
12+
--EXPECTF--
13+
bool(true)
14+
15+
Warning: mb_ereg_search(): Pattern is not valid under UTF-8 encoding in %s on line %d
16+
bool(false)
17+
bool(false)

0 commit comments

Comments
 (0)