Skip to content

Commit 61e0f85

Browse files
laruencesmalyshev
authored andcommitted
Fixed Bug #67538 (SPL Iterators use-after-free)
1 parent d491b2f commit 61e0f85

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

ext/spl/spl_dllist.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,10 @@ PHPAPI zend_class_entry *spl_ce_SplStack;
4343

4444
#define SPL_LLIST_DELREF(elem) if(!--(elem)->rc) { \
4545
efree(elem); \
46-
elem = NULL; \
4746
}
4847

4948
#define SPL_LLIST_CHECK_DELREF(elem) if((elem) && !--(elem)->rc) { \
5049
efree(elem); \
51-
elem = NULL; \
5250
}
5351

5452
#define SPL_LLIST_ADDREF(elem) (elem)->rc++
@@ -916,6 +914,11 @@ SPL_METHOD(SplDoublyLinkedList, offsetUnset)
916914
llist->dtor(element TSRMLS_CC);
917915
}
918916

917+
if (intern->traverse_pointer == element) {
918+
SPL_LLIST_DELREF(element);
919+
intern->traverse_pointer = NULL;
920+
}
921+
919922
zval_ptr_dtor((zval **)&element->data);
920923
element->data = NULL;
921924

ext/spl/tests/bug67538.phpt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
--TEST--
2+
Bug #67538 (SPL Iterators use-after-free)
3+
--FILE--
4+
<?php
5+
$list = new SplDoublyLinkedList();
6+
$list->push('a');
7+
$list->push('b');
8+
9+
$list->rewind();
10+
$list->offsetUnset(0);
11+
$list->push('b');
12+
$list->offsetUnset(0);
13+
$list->next();
14+
echo "okey";
15+
?>
16+
--EXPECTF--
17+
okey

0 commit comments

Comments
 (0)