From: Xinchen Hui Date: Sat, 21 Mar 2015 08:54:45 +0000 (+0800) Subject: More error conditions X-Git-Tag: PRE_PHP7_NSAPI_REMOVAL~566 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4180226117f90dd24f15fcdd793deef26c3cdf3c;p=php More error conditions --- diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index 57b0eb921e..99ef02059f 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -1275,8 +1275,8 @@ static zend_string *php_replace_in_subject(zval *regex, zval *replace, zval *sub *replace_value, empty_replace; zend_string *result; - zend_string *subject_str = zval_get_string(subject); uint32_t replace_idx; + zend_string *subject_str = zval_get_string(subject); /* FIXME: This might need to be changed to STR_EMPTY_ALLOC(). Check if this zval could be dtor()'ed somehow */ ZVAL_EMPTY_STRING(&empty_replace); @@ -1512,6 +1512,7 @@ static PHP_FUNCTION(preg_replace_callback_array) ZEND_PARSE_PARAMETERS_END(); #endif + ZVAL_UNDEF(&zv); ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(pattern), num_idx, str_idx, replace) { if (str_idx) { ZVAL_STR_COPY(®ex, str_idx); @@ -1537,8 +1538,18 @@ static PHP_FUNCTION(preg_replace_callback_array) zval_ptr_dtor(return_value); } - ZVAL_COPY_VALUE(return_value, &zv); zval_ptr_dtor(®ex); + + if (Z_ISUNDEF(zv)) { + RETURN_NULL(); + } + + ZVAL_COPY_VALUE(return_value, &zv); + + if (UNEXPECTED(EG(exception))) { + zval_dtor(return_value); + RETURN_NULL(); + } } ZEND_HASH_FOREACH_END(); if (zcount) { diff --git a/ext/pcre/tests/preg_replace_callback_array.phpt b/ext/pcre/tests/preg_replace_callback_array.phpt index 529f704db6..14a4656eb1 100644 --- a/ext/pcre/tests/preg_replace_callback_array.phpt +++ b/ext/pcre/tests/preg_replace_callback_array.phpt @@ -4,12 +4,19 @@ preg_replace_callback_array() basic functions 'f'), 'z')); -} catch(Exception $e) {} + var_dump($c = preg_replace_callback_array(array('/\w*/' => 'f', '/\w/' => 'a'), 'z')); +} catch(Exception $e) { + var_dump($e->getMessage()); +} +var_dump($c); function g($x) { return "'$x[0]'"; @@ -22,6 +29,10 @@ var_dump(preg_replace_callback_array(array('~\A.~' => 'g'), array(array('xyz'))) var_dump(preg_replace_callback_array(array('~\A.~' => create_function('$m', 'return strtolower($m[0]);')), 'ABC')); ?> --EXPECTF-- +string(1) "f" + +Notice: Undefined variable: c in %spreg_replace_callback_array.php on line %d +NULL array(3) { [0]=> string(12) "'a' 'b3' bcd" diff --git a/ext/pcre/tests/preg_replace_callback_array2.phpt b/ext/pcre/tests/preg_replace_callback_array2.phpt index c3d3acf0a8..fca71673c9 100644 --- a/ext/pcre/tests/preg_replace_callback_array2.phpt +++ b/ext/pcre/tests/preg_replace_callback_array2.phpt @@ -18,7 +18,10 @@ var_dump($b); $b = ""; var_dump(preg_replace_callback_array(array("xx" => "s"), $a, -1, $b)); var_dump($b); +function f() { +} +var_dump(preg_replace_callback_array(array('/\w' => 'f'), 'z')); echo "Done\n"; ?> --EXPECTF-- @@ -44,8 +47,11 @@ Warning: preg_replace_callback() expects parameter 4 to be integer, array given NULL string(0) "" -Warning: preg_replace_callback_array(): 's' is not a valid callback in %s on line %d +Warning: preg_replace_callback_array(): 's' is not a valid callback in %spreg_replace_callback_array2.php on line %d array(0) { } string(0) "" + +Warning: preg_replace_callback_array(): No ending delimiter '/' found in %spreg_replace_callback_array2.php on line %d +NULL Done