diff options
author | Yasuo Ohgaki <yohgaki@php.net> | 2016-09-01 19:15:32 +0900 |
---|---|---|
committer | Stanislav Malyshev <stas@php.net> | 2019-03-28 00:31:57 -0700 |
commit | 738016bd884a339009e1af371eaba0fee60bf23b (patch) | |
tree | 1b46e398ce25f03bde6f737a7f4cd5e16b918700 /ext/mbstring/mbstring.c | |
parent | 218154e6958bc911ee2640baca10854cb2c33e20 (diff) | |
download | php-git-738016bd884a339009e1af371eaba0fee60bf23b.tar.gz |
Implement RF bug #72777 - ensure stack limits on mbstring functions.
The patch creates new config: mbstring.regex_stack_limit, which
defaults to 100000.
Diffstat (limited to 'ext/mbstring/mbstring.c')
-rw-r--r-- | ext/mbstring/mbstring.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 0e255e98d2..36b6c478b8 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -1027,9 +1027,18 @@ static void *_php_mb_compile_regex(const char *pattern) /* {{{ _php_mb_match_regex */ static int _php_mb_match_regex(void *opaque, const char *str, size_t str_len) { - return onig_search((php_mb_regex_t *)opaque, (const OnigUChar *)str, - (const OnigUChar*)str + str_len, (const OnigUChar *)str, - (const OnigUChar*)str + str_len, NULL, ONIG_OPTION_NONE) >= 0; + OnigMatchParam *mp = onig_new_match_param(); + int err; + onig_initialize_match_param(mp); + if(MBSTRG(regex_stack_limit) > 0 && MBSTRG(regex_stack_limit) < UINT_MAX) { + onig_set_match_stack_limit_size_of_match_param(mp, (unsigned int)MBSTRG(regex_stack_limit)); + } + /* search */ + err = onig_search_with_param((php_mb_regex_t *)opaque, (const OnigUChar *)str, + (const OnigUChar*)str + str_len, (const OnigUChar *)str, + (const OnigUChar*)str + str_len, NULL, ONIG_OPTION_NONE, mp); + onig_free_match_param(mp); + return err >= 0; } /* }}} */ @@ -1502,6 +1511,9 @@ PHP_INI_BEGIN() PHP_INI_ALL, OnUpdateBool, strict_detection, zend_mbstring_globals, mbstring_globals) +#if HAVE_MBREGEX + STD_PHP_INI_ENTRY("mbstring.regex_stack_limit", "100000",PHP_INI_ALL, OnUpdateLong, regex_stack_limit, zend_mbstring_globals, mbstring_globals) +#endif PHP_INI_END() /* }}} */ |