Re: svn: /php/php-src/trunk/ext/mbstring/ php_mbregex.c
| From: | Laruence | Date: | Fri, 07 Oct 2011 05:16:50 +0000 |
| Subject: | Re: svn: /php/php-src/trunk/ext/mbstring/ php_mbregex.c | ||
| References: | 1 | Groups: | php.cvs |
| Request: | Send a blank email to php-cvs+get-66706@lists.php.net to get a copy of this message | ||
cc hirokawa
thanks
2011/10/7 Xinchen Hui <laruence@php.net>:
> laruence Fri, 07 Oct 2011 04:24:04 +0000
>
> Revision:
> http://svn.php.net/viewvc?view=revision&revision=317850
>
> Log:
> Fix #55819 crash on mb_ereg_replace_callback
> Need hirokawa to review this.
>
> Bug: https://bugs.php.net/55819 (Assigned) segfault on
> mb_ereg_replace_callback
>
> Changed paths:
> U php/php-src/trunk/ext/mbstring/php_mbregex.c
>
> Modified: php/php-src/trunk/ext/mbstring/php_mbregex.c
> ===================================================================
> --- php/php-src/trunk/ext/mbstring/php_mbregex.c 2011-10-07 04:14:31 UTC (rev
> 317849)
> +++ php/php-src/trunk/ext/mbstring/php_mbregex.c 2011-10-07 04:24:04 UTC (rev
> 317850)
> @@ -793,11 +793,12 @@
>
> char *replace;
> int replace_len;
> - zval **arg_replace_zval;
>
> + zend_fcall_info arg_replace_fci;
> + zend_fcall_info_cache arg_replace_fci_cache;
> +
> char *string;
> int string_len;
> - zval **arg_string_zval;
>
> char *p;
> php_mb_regex_t *re;
> @@ -828,20 +829,24 @@
> char *option_str = NULL;
> int option_str_len = 0;
>
> - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZZ|s",
> -
> &arg_pattern_zval,
> -
> &arg_replace_zval,
> -
> &arg_string_zval,
> -
> &option_str, &option_str_len) == FAILURE) {
> - RETURN_FALSE;
> + if (!is_callable) {
> + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
> "Zss|s",
> + &arg_pattern_zval,
> + &replace,
> &replace_len,
> + &string,
> &string_len,
> + &option_str,
> &option_str_len) == FAILURE) {
> + RETURN_FALSE;
> + }
> + } else {
> + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
> "Zfs|s",
> + &arg_pattern_zval,
> + &arg_replace_fci,
> &arg_replace_fci_cache,
> + &string,
> &string_len,
> + &option_str,
> &option_str_len) == FAILURE) {
> + RETURN_FALSE;
> + }
> }
>
> - replace = Z_STRVAL_PP(arg_replace_zval);
> - replace_len = Z_STRLEN_PP(arg_replace_zval);
> -
> - string = Z_STRVAL_PP(arg_string_zval);
> - string_len = Z_STRLEN_PP(arg_string_zval);
> -
> if (option_str != NULL) {
> _php_mb_regex_init_options(option_str, option_str_len,
> &options, &syntax, &eval);
> } else {
> @@ -876,15 +881,6 @@
> }
>
> if (is_callable) {
> - char *callback_name;
> - if (!zend_is_callable(*arg_replace_zval, 0, &callback_name
> TSRMLS_CC)) {
> - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Requires
> argument 2, '%s', to be a valid callback", callback_name);
> - efree(callback_name);
> - MAKE_COPY_ZVAL(arg_string_zval, return_value);
> - RETURN_FALSE;
> - }
> - efree(callback_name);
> -
> if (eval) {
> php_error_docref(NULL TSRMLS_CC, E_WARNING, "Option
> 'e' cannot be used with replacement callback");
> RETURN_FALSE;
> @@ -973,8 +969,10 @@
> /* null terminate buffer */
> smart_str_0(&eval_buf);
>
> - if (call_user_function_ex(EG(function_table),
> NULL, *arg_replace_zval, &retval_ptr, 1, args, 0,
> -
> NULL TSRMLS_CC) == SUCCESS && retval_ptr) {
> + arg_replace_fci.param_count = 1;
> + arg_replace_fci.params = args;
> + arg_replace_fci.retval_ptr_ptr =
> &retval_ptr;
> + if (zend_call_function(&arg_replace_fci,
> &arg_replace_fci_cache TSRMLS_CC) == SUCCESS && arg_replace_fci.retval_ptr_ptr) {
>
> convert_to_string_ex(&retval_ptr);
> smart_str_appendl(&out_buf,
> Z_STRVAL_P(retval_ptr), Z_STRLEN_P(retval_ptr));
> eval_buf.len = 0;
>
>
> --
> PHP CVS Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
--
Laruence Xinchen Hui
http://www.laruence.com/