diff options
author | Antony Dovgal <tony2001@php.net> | 2006-10-11 11:09:42 +0000 |
---|---|---|
committer | Antony Dovgal <tony2001@php.net> | 2006-10-11 11:09:42 +0000 |
commit | a81eae5d01da00878396798e396c4f0828e29ba8 (patch) | |
tree | c7629a005730d7e4a9bc45eb603642282975555e /ext/mbstring/php_mbregex.c | |
parent | 9f5de3bb5cb94bba8e7c7ef25455af2b16784433 (diff) | |
download | php-git-a81eae5d01da00878396798e396c4f0828e29ba8.tar.gz |
MFH: fix segfault/leak, add test
Diffstat (limited to 'ext/mbstring/php_mbregex.c')
-rw-r--r-- | ext/mbstring/php_mbregex.c | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c index e10802be9f..4c381c3755 100644 --- a/ext/mbstring/php_mbregex.c +++ b/ext/mbstring/php_mbregex.c @@ -518,7 +518,7 @@ PHP_FUNCTION(mb_regex_encoding) static void _php_mb_regex_ereg_exec(INTERNAL_FUNCTION_PARAMETERS, int icase) { zval tmp; - zval *arg_pattern, *array; + zval **arg_pattern, *array; char *string; int string_len; php_mb_regex_t *re; @@ -529,7 +529,7 @@ static void _php_mb_regex_ereg_exec(INTERNAL_FUNCTION_PARAMETERS, int icase) array = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zs|z", &arg_pattern, &string, &string_len, &array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zs|z", &arg_pattern, &string, &string_len, &array) == FAILURE) { RETURN_FALSE; } @@ -539,18 +539,15 @@ static void _php_mb_regex_ereg_exec(INTERNAL_FUNCTION_PARAMETERS, int icase) } /* compile the regular expression from the supplied regex */ - if (Z_TYPE_P(arg_pattern) != IS_STRING) { + if (Z_TYPE_PP(arg_pattern) != IS_STRING) { /* we convert numbers to integers and treat them as a string */ - tmp = *arg_pattern; - zval_copy_ctor(&tmp); - if (Z_TYPE_P(&tmp) == IS_DOUBLE) { - convert_to_long(&tmp); /* get rid of decimal places */ + if (Z_TYPE_PP(arg_pattern) == IS_DOUBLE) { + convert_to_long_ex(arg_pattern); /* get rid of decimal places */ } - convert_to_string(&tmp); - arg_pattern = &tmp; + convert_to_string_ex(arg_pattern); /* don't bother doing an extended regex with just a number */ } - re = php_mbregex_compile_pattern(Z_STRVAL_P(arg_pattern), Z_STRLEN_P(arg_pattern), options, MBSTRG(current_mbctype), MBSTRG(regex_default_syntax) TSRMLS_CC); + re = php_mbregex_compile_pattern(Z_STRVAL_PP(arg_pattern), Z_STRLEN_PP(arg_pattern), options, MBSTRG(current_mbctype), MBSTRG(regex_default_syntax) TSRMLS_CC); if (re == NULL) { RETVAL_FALSE; goto out; @@ -590,9 +587,6 @@ out: if (regs != NULL) { onig_region_free(regs, 1); } - if (arg_pattern == &tmp) { - zval_dtor(&tmp); - } } /* }}} */ |