1 Patch adapted for PHP 5.3.3
4 From df78c48354f376cf419d7a97f88ca07d572f00fb Mon Sep 17 00:00:00 2001
5 From: Xinchen Hui <laruence@php.net>
6 Date: Wed, 2 Jul 2014 17:45:09 +0800
7 Subject: [PATCH] Fixed Bug #67538 (SPL Iterators use-after-free)
11 ext/spl/spl_dllist.c | 7 +++++--
12 ext/spl/tests/bug67538.phpt | 17 +++++++++++++++++
13 3 files changed, 25 insertions(+), 2 deletions(-)
14 create mode 100644 ext/spl/tests/bug67538.phpt
16 diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c
17 index 39a0733..0b44d41 100644
18 --- a/ext/spl/spl_dllist.c
19 +++ b/ext/spl/spl_dllist.c
20 @@ -40,12 +40,10 @@ PHPAPI zend_class_entry *spl_ce_SplStack;
22 #define SPL_LLIST_DELREF(elem) if(!--(elem)->rc) { \
27 #define SPL_LLIST_CHECK_DELREF(elem) if((elem) && !--(elem)->rc) { \
32 #define SPL_LLIST_ADDREF(elem) (elem)->rc++
33 @@ -911,6 +909,11 @@ SPL_METHOD(SplDoublyLinkedList, offsetUnset)
34 llist->dtor(element TSRMLS_CC);
37 + if (intern->traverse_pointer == element) {
38 + SPL_LLIST_DELREF(element);
39 + intern->traverse_pointer = NULL;
42 zval_ptr_dtor((zval **)&element->data);
45 diff --git a/ext/spl/tests/bug67538.phpt b/ext/spl/tests/bug67538.phpt
47 index 0000000..b6f3848
49 +++ b/ext/spl/tests/bug67538.phpt
52 +Bug #67538 (SPL Iterators use-after-free)
55 +$list = new SplDoublyLinkedList();
60 +$list->offsetUnset(0);
62 +$list->offsetUnset(0);