helly Tue May 16 08:19:56 2006 UTC
Added files:
/php-src/ext/spl/tests bug37457.phpt
Modified files:
/php-src/ext/spl spl_iterators.c
Log:
- Fixed Bug #37457 (Crash when an exception is thrown in accept() method of
FilterIterator)
http://cvs.php.net/viewcvs.cgi/php-src/ext/spl/spl_iterators.c?r1=1.126&r2=1.127&diff_format=u
Index: php-src/ext/spl/spl_iterators.c
diff -u php-src/ext/spl/spl_iterators.c:1.126
php-src/ext/spl/spl_iterators.c:1.127
--- php-src/ext/spl/spl_iterators.c:1.126 Fri May 12 09:42:19 2006
+++ php-src/ext/spl/spl_iterators.c Tue May 16 08:19:56 2006
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: spl_iterators.c,v 1.126 2006/05/12 09:42:19 tony2001 Exp $ */
+/* $Id: spl_iterators.c,v 1.127 2006/05/16 08:19:56 helly Exp $ */
#ifdef HAVE_CONFIG_H
# include "config.h"
@@ -1184,7 +1184,9 @@
}
zval_ptr_dtor(&retval);
}
-
+ if (EG(exception)) {
+ return;
+ }
intern->inner.iterator->funcs->move_forward(intern->inner.iterator TSRMLS_CC);
}
spl_dual_it_free(intern TSRMLS_CC);
@@ -1664,11 +1666,14 @@
zend_call_method_with_0_params(&intern->inner.zobject,
intern->inner.ce, NULL, "haschildren", &retval);
if (zend_is_true(retval)) {
zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL,
"getchildren", &zchildren);
- if (EG(exception) && intern->u.caching.flags &
CIT_CATCH_GET_CHILD) {
- zend_clear_exception(TSRMLS_C);
+ if (EG(exception)) {
if (zchildren) {
zval_ptr_dtor(&zchildren);
}
+ if (intern->u.caching.flags &
CIT_CATCH_GET_CHILD) {
+ zend_clear_exception(TSRMLS_C);
+ }
+ return;
} else {
INIT_PZVAL(&zflags);
ZVAL_LONG(&zflags,
intern->u.caching.flags & CIT_PUBLIC);
http://cvs.php.net/viewcvs.cgi/php-src/ext/spl/tests/bug37457.phpt?view=markup&rev=1.1
Index: php-src/ext/spl/tests/bug37457.phpt
+++ php-src/ext/spl/tests/bug37457.phpt
--TEST--
Bug #37457 (Crash when an exception is thrown in accept() method of
FilterIterator)
--FILE--
<?php
class Collection implements Iterator
{
protected $array, $valid = false;
public function __construct(array $a)
{
echo __METHOD__ . "\n";
$this->array = $a;
}
public function current()
{
echo __METHOD__ . "\n";
return current($this->array);
}
public function key()
{
echo __METHOD__ . "\n";
return key($this->array);
}
public function next()
{
echo __METHOD__ . "\n";
$this->valid = (false !== next($this->array));
}
public function valid()
{
echo __METHOD__ . "\n";
return $this->valid;
}
public function rewind()
{
echo __METHOD__ . "\n";
$this->valid = (false !== reset($this->array));
}
}
class TestFilter extends FilterIterator
{
public function accept()
{
echo __METHOD__ . "\n";
throw new Exception("Failure in Accept");
}
}
$test = new TestFilter(new Collection(array(0)));
try
{
foreach ($test as $item)
{
echo $item;
}
}
catch (Exception $e)
{
var_dump($e->getMessage());
}
?>
===DONE===
--EXPECTF--
Collection::__construct
Collection::rewind
Collection::valid
Collection::current
Collection::key
TestFilter::accept
string(17) "Failure in Accept"
===DONE===
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php