diff options
Diffstat (limited to 'ext/mbstring/php_mbregex.c')
-rw-r--r-- | ext/mbstring/php_mbregex.c | 61 |
1 files changed, 33 insertions, 28 deletions
diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c index b6ed2b86e9..76aff4f244 100644 --- a/ext/mbstring/php_mbregex.c +++ b/ext/mbstring/php_mbregex.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 7 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2018 The PHP Group | + | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -39,6 +39,7 @@ typedef void OnigMatchParam; #define onig_new_match_param() (NULL) #define onig_initialize_match_param(x) (void)(x) #define onig_set_match_stack_limit_size_of_match_param(x, y) +#define onig_set_retry_limit_in_match_of_match_param(x, y) #define onig_free_match_param(x) #define onig_search_with_param(reg, str, end, start, range, region, option, mp) \ onig_search(reg, str, end, start, range, region, option) @@ -117,7 +118,13 @@ void php_mb_regex_globals_free(zend_mb_regex_globals *pglobals) /* {{{ PHP_MINIT_FUNCTION(mb_regex) */ PHP_MINIT_FUNCTION(mb_regex) { + char version[256]; + onig_init(); + + snprintf(version, sizeof(version), "%d.%d.%d", + ONIGURUMA_VERSION_MAJOR, ONIGURUMA_VERSION_MINOR, ONIGURUMA_VERSION_TEENY); + REGISTER_STRING_CONSTANT("MB_ONIGURUMA_VERSION", version, CONST_CS | CONST_PERSISTENT); return SUCCESS; } /* }}} */ @@ -171,13 +178,6 @@ PHP_MINFO_FUNCTION(mb_regex) ONIGURUMA_VERSION_MAJOR, ONIGURUMA_VERSION_MINOR, ONIGURUMA_VERSION_TEENY); -#ifdef PHP_ONIG_BUNDLED -#ifdef USE_COMBINATION_EXPLOSION_CHECK - php_info_print_table_row(2, "Multibyte regex (oniguruma) backtrack check", "On"); -#else /* USE_COMBINATION_EXPLOSION_CHECK */ - php_info_print_table_row(2, "Multibyte regex (oniguruma) backtrack check", "Off"); -#endif /* USE_COMBINATION_EXPLOSION_CHECK */ -#endif /* PHP_BUNDLED_ONIG */ php_info_print_table_row(2, "Multibyte regex (oniguruma) version", buf); php_info_print_table_end(); } @@ -876,6 +876,9 @@ static int _php_mb_onig_search(regex_t* reg, const OnigUChar* str, const OnigUCh if (!ZEND_LONG_UINT_OVFL(MBSTRG(regex_stack_limit))) { onig_set_match_stack_limit_size_of_match_param(mp, (unsigned int)MBSTRG(regex_stack_limit)); } + if (!ZEND_LONG_UINT_OVFL(MBSTRG(regex_retry_limit))) { + onig_set_retry_limit_in_match_of_match_param(mp, (unsigned int)MBSTRG(regex_retry_limit)); + } /* search */ err = onig_search_with_param(reg, str, end, start, range, region, option, mp); onig_free_match_param(mp); @@ -896,13 +899,15 @@ static void _php_mb_regex_ereg_exec(INTERNAL_FUNCTION_PARAMETERS, int icase) OnigOptionType options; char *str; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs|z/", &arg_pattern, &string, &string_len, &array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs|z", &arg_pattern, &string, &string_len, &array) == FAILURE) { RETURN_FALSE; } if (array != NULL) { - zval_ptr_dtor(array); - array_init(array); + array = zend_try_array_init(array); + if (!array) { + return; + } } if (!php_mb_check_encoding( @@ -924,7 +929,9 @@ static void _php_mb_regex_ereg_exec(INTERNAL_FUNCTION_PARAMETERS, int icase) if (Z_TYPE_P(arg_pattern) == IS_DOUBLE) { convert_to_long_ex(arg_pattern); /* get rid of decimal places */ } - convert_to_string_ex(arg_pattern); + if (!try_convert_to_string(arg_pattern)) { + return; + } /* don't bother doing an extended regex with just a number */ } @@ -1081,6 +1088,10 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp arg_pattern = Z_STRVAL_P(arg_pattern_zval); arg_pattern_len = Z_STRLEN_P(arg_pattern_zval); } else { + php_error_docref(NULL, E_DEPRECATED, + "Non-string patterns will be interpreted as strings in the future. " + "Use an explicit chr() call to preserve the current behavior"); + /* FIXME: this code is not multibyte aware! */ convert_to_long_ex(arg_pattern_zval); pat_buf[0] = (char)Z_LVAL_P(arg_pattern_zval); @@ -1151,7 +1162,7 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp if (zend_eval_stringl(ZSTR_VAL(eval_str), ZSTR_LEN(eval_str), &v, description) == FAILURE) { efree(description); zend_throw_error(NULL, "Failed evaluating code: %s%s", PHP_EOL, ZSTR_VAL(eval_str)); - onig_region_free(regs, 0); + onig_region_free(regs, 1); smart_str_free(&out_buf); smart_str_free(&eval_buf); RETURN_FALSE; @@ -1389,9 +1400,12 @@ PHP_FUNCTION(mb_ereg_match) mp = onig_new_match_param(); onig_initialize_match_param(mp); - if(MBSTRG(regex_stack_limit) > 0 && MBSTRG(regex_stack_limit) < UINT_MAX) { + 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)); } + if (MBSTRG(regex_retry_limit) > 0 && MBSTRG(regex_retry_limit) < UINT_MAX) { + onig_set_retry_limit_in_match_of_match_param(mp, (unsigned int)MBSTRG(regex_retry_limit)); + } /* match */ err = onig_match_with_param(re, (OnigUChar *)string, (OnigUChar *)(string + string_len), (OnigUChar *)string, NULL, 0, mp); onig_free_match_param(mp); @@ -1412,7 +1426,7 @@ _php_mb_regex_ereg_search_exec(INTERNAL_FUNCTION_PARAMETERS, int mode) size_t arg_pattern_len, arg_options_len; int err; size_t n, i, pos, len, beg, end; - OnigOptionType option; + OnigOptionType option = 0; OnigUChar *str; OnigSyntaxType *syntax; @@ -1420,11 +1434,11 @@ _php_mb_regex_ereg_search_exec(INTERNAL_FUNCTION_PARAMETERS, int mode) return; } - option = MBREX(regex_default_options); - if (arg_options) { - option = 0; _php_mb_regex_init_options(arg_options, arg_options_len, &option, &syntax, NULL); + } else { + option |= MBREX(regex_default_options); + syntax = MBREX(regex_default_syntax); } if (MBREX(search_regs)) { @@ -1434,7 +1448,7 @@ _php_mb_regex_ereg_search_exec(INTERNAL_FUNCTION_PARAMETERS, int mode) if (arg_pattern) { /* create regex pattern buffer */ - if ((MBREX(search_re) = php_mbregex_compile_pattern(arg_pattern, arg_pattern_len, option, MBREX(current_mbctype), MBREX(regex_default_syntax))) == NULL) { + if ((MBREX(search_re) = php_mbregex_compile_pattern(arg_pattern, arg_pattern_len, option, MBREX(current_mbctype), syntax)) == NULL) { RETURN_FALSE; } } @@ -1717,12 +1731,3 @@ PHP_FUNCTION(mb_regex_set_options) /* }}} */ #endif /* HAVE_MBREGEX */ - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - * vim600: fdm=marker - * vim: noet sw=4 ts=4 - */ |