Skip to content

Commit a89c4a3

Browse files
committed
Revert "- Fixed bug #61418 (Segmentation fault when DirectoryIterator's or" - causes bug #61482
This reverts commit 714f1ff.
1 parent 7164175 commit a89c4a3

File tree

2 files changed

+15
-55
lines changed

2 files changed

+15
-55
lines changed

ext/spl/spl_directory.c

Lines changed: 15 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -120,16 +120,6 @@ static void spl_filesystem_object_free_storage(void *object TSRMLS_DC) /* {{{ */
120120
spl_filesystem_file_free_line(intern TSRMLS_CC);
121121
break;
122122
}
123-
124-
{
125-
zend_object_iterator *iterator;
126-
iterator = (zend_object_iterator*)
127-
spl_filesystem_object_to_iterator(intern);
128-
if (iterator->data != NULL) {
129-
iterator->data = NULL;
130-
iterator->funcs->dtor(iterator TSRMLS_CC);
131-
}
132-
}
133123
efree(object);
134124
} /* }}} */
135125

@@ -1637,15 +1627,10 @@ zend_object_iterator *spl_filesystem_dir_get_iterator(zend_class_entry *ce, zval
16371627
dir_object = (spl_filesystem_object*)zend_object_store_get_object(object TSRMLS_CC);
16381628
iterator = spl_filesystem_object_to_iterator(dir_object);
16391629

1640-
/* initialize iterator if it wasn't gotten before */
1641-
if (iterator->intern.data == NULL) {
1642-
iterator->intern.data = object;
1643-
iterator->intern.funcs = &spl_filesystem_dir_it_funcs;
1644-
/* ->current must be initialized; rewind doesn't set it and valid
1645-
* doesn't check whether it's set */
1646-
iterator->current = object;
1647-
}
1648-
zval_add_ref(&object);
1630+
Z_SET_REFCOUNT_P(object, Z_REFCOUNT_P(object) + 2);
1631+
iterator->intern.data = (void*)object;
1632+
iterator->intern.funcs = &spl_filesystem_dir_it_funcs;
1633+
iterator->current = object;
16491634

16501635
return (zend_object_iterator*)iterator;
16511636
}
@@ -1724,15 +1709,15 @@ static void spl_filesystem_dir_it_rewind(zend_object_iterator *iter TSRMLS_DC)
17241709
static void spl_filesystem_tree_it_dtor(zend_object_iterator *iter TSRMLS_DC)
17251710
{
17261711
spl_filesystem_iterator *iterator = (spl_filesystem_iterator *)iter;
1712+
zval *zfree = (zval*)iterator->intern.data;
17271713

1728-
if (iterator->intern.data) {
1729-
zval *object = iterator->intern.data;
1730-
zval_ptr_dtor(&object);
1731-
} else {
1732-
if (iterator->current) {
1733-
zval_ptr_dtor(&iterator->current);
1734-
}
1714+
if (iterator->current) {
1715+
zval_ptr_dtor(&iterator->current);
17351716
}
1717+
iterator->intern.data = NULL; /* mark as unused */
1718+
/* free twice as we add ref twice */
1719+
zval_ptr_dtor(&zfree);
1720+
zval_ptr_dtor(&zfree);
17361721
}
17371722
/* }}} */
17381723

@@ -1843,12 +1828,10 @@ zend_object_iterator *spl_filesystem_tree_get_iterator(zend_class_entry *ce, zva
18431828
dir_object = (spl_filesystem_object*)zend_object_store_get_object(object TSRMLS_CC);
18441829
iterator = spl_filesystem_object_to_iterator(dir_object);
18451830

1846-
/* initialize iterator if wasn't gotten before */
1847-
if (iterator->intern.data == NULL) {
1848-
iterator->intern.data = object;
1849-
iterator->intern.funcs = &spl_filesystem_tree_it_funcs;
1850-
}
1851-
zval_add_ref(&object);
1831+
Z_SET_REFCOUNT_P(object, Z_REFCOUNT_P(object) + 2);
1832+
iterator->intern.data = (void*)object;
1833+
iterator->intern.funcs = &spl_filesystem_tree_it_funcs;
1834+
iterator->current = NULL;
18521835

18531836
return (zend_object_iterator*)iterator;
18541837
}

ext/spl/tests/bug61418.phpt

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)