From: Marcus Boerger Date: Thu, 18 Oct 2007 04:41:39 +0000 (+0000) Subject: - Fix #42703 X-Git-Tag: RELEASE_1_3_1~831 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=80893e572794a734abf92d9350acc37d36ad2359;p=php - Fix #42703 --- diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index a1bb2f008c..58bf8144f6 100755 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -1124,15 +1124,17 @@ static inline int spl_dual_it_fetch(spl_dual_it_object *intern, int check_more T spl_dual_it_free(intern TSRMLS_CC); if (!check_more || spl_dual_it_valid(intern TSRMLS_CC) == SUCCESS) { intern->inner.iterator->funcs->get_current_data(intern->inner.iterator, &data TSRMLS_CC); - intern->current.data = *data; - Z_ADDREF_P(intern->current.data); + if (data && *data) { + intern->current.data = *data; + Z_ADDREF_P(intern->current.data); + } if (intern->inner.iterator->funcs->get_current_key) { intern->current.key_type = intern->inner.iterator->funcs->get_current_key(intern->inner.iterator, &intern->current.str_key, &intern->current.str_key_len, &intern->current.int_key TSRMLS_CC); } else { intern->current.key_type = HASH_KEY_IS_LONG; intern->current.int_key = intern->current.pos; } - return SUCCESS; + return EG(exception) ? FAILURE : SUCCESS; } return FAILURE; } diff --git a/ext/spl/tests/bug42703.phpt b/ext/spl/tests/bug42703.phpt new file mode 100755 index 0000000000..5c52763cd6 --- /dev/null +++ b/ext/spl/tests/bug42703.phpt @@ -0,0 +1,41 @@ +--TEST-- +Bug #42703 (Exception raised in an iterator::current() causes segfault in FilterIterator) +--FILE-- + $value) { + echo $key, $value; + } +} +catch (Exception $e) { + var_dump($e->getMessage()); +} + +var_dump($itit->current()); +var_dump($itit->key()); +?> +--EXPECTF-- +string(3) "boo" +NULL +NULL