cc hirokawa thanks 2011/10/7 Xinchen Hui <larue...@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/