Fix 72122 - don't use EH_THROW for calls to getIterator

This commit is contained in:
Loz Calver 2016-05-06 10:22:23 +01:00 committed by Julien Pauli
parent 7903276f4c
commit f5ccd71d0c
2 changed files with 23 additions and 0 deletions

View File

@ -481,7 +481,9 @@ static void spl_recursive_it_it_construct(INTERNAL_FUNCTION_PARAMETERS, zend_cla
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "o|lzl", &iterator, &flags, &user_caching_it_flags, &mode) == SUCCESS) {
if (instanceof_function(Z_OBJCE_P(iterator), zend_ce_aggregate TSRMLS_CC)) {
zval *aggregate = iterator;
zend_restore_error_handling(&error_handling TSRMLS_CC);
zend_call_method_with_0_params(&aggregate, Z_OBJCE_P(aggregate), &Z_OBJCE_P(aggregate)->iterator_funcs.zf_new_iterator, "getiterator", &iterator);
zend_replace_error_handling(EH_THROW, spl_ce_InvalidArgumentException, &error_handling TSRMLS_CC);
inc_refcount = 0;
}
@ -511,7 +513,9 @@ static void spl_recursive_it_it_construct(INTERNAL_FUNCTION_PARAMETERS, zend_cla
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "o|ll", &iterator, &mode, &flags) == SUCCESS) {
if (instanceof_function(Z_OBJCE_P(iterator), zend_ce_aggregate TSRMLS_CC)) {
zval *aggregate = iterator;
zend_restore_error_handling(&error_handling TSRMLS_CC);
zend_call_method_with_0_params(&aggregate, Z_OBJCE_P(aggregate), &Z_OBJCE_P(aggregate)->iterator_funcs.zf_new_iterator, "getiterator", &iterator);
zend_replace_error_handling(EH_THROW, spl_ce_InvalidArgumentException, &error_handling TSRMLS_CC);
inc_refcount = 0;
}
} else {
@ -1514,7 +1518,9 @@ static spl_dual_it_object* spl_dual_it_construct(INTERNAL_FUNCTION_PARAMETERS, z
ce = *pce_cast;
}
if (instanceof_function(ce, zend_ce_aggregate TSRMLS_CC)) {
zend_restore_error_handling(&error_handling TSRMLS_CC);
zend_call_method_with_0_params(&zobject, ce, &ce->iterator_funcs.zf_new_iterator, "getiterator", &retval);
zend_replace_error_handling(EH_THROW, spl_ce_InvalidArgumentException, &error_handling TSRMLS_CC);
if (EG(exception)) {
if (retval) {
zval_ptr_dtor(&retval);

View File

@ -0,0 +1,17 @@
--TEST--
Bug #72122 (IteratorIterator breaks '@' error suppression)
--FILE--
<?php
class CustomIterator implements IteratorAggregate {
public function getIterator() {
@unlink('/missing/file.txt');
return new ArrayIterator(array('item'));
}
}
$obj = new CustomIterator;
$iterator = new IteratorIterator($obj);
echo get_class($iterator);
?>
--EXPECT--
IteratorIterator