@@ -120,6 +120,16 @@ static void spl_filesystem_object_free_storage(void *object TSRMLS_DC) /* {{{ */
120
120
spl_filesystem_file_free_line (intern TSRMLS_CC ) ;
121
121
break ;
122
122
}
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
+ }
123
133
efree (object );
124
134
} /* }}} */
125
135
@@ -1638,10 +1648,15 @@ zend_object_iterator *spl_filesystem_dir_get_iterator(zend_class_entry *ce, zval
1638
1648
dir_object = (spl_filesystem_object * )zend_object_store_get_object (object TSRMLS_CC );
1639
1649
iterator = spl_filesystem_object_to_iterator (dir_object );
1640
1650
1641
- Z_SET_REFCOUNT_P (object , Z_REFCOUNT_P (object ) + 2 );
1642
- iterator -> intern .data = (void * )object ;
1643
- iterator -> intern .funcs = & spl_filesystem_dir_it_funcs ;
1644
- iterator -> current = object ;
1651
+ /* initialize iterator if it wasn't gotten before */
1652
+ if (iterator -> intern .data == NULL ) {
1653
+ iterator -> intern .data = object ;
1654
+ iterator -> intern .funcs = & spl_filesystem_dir_it_funcs ;
1655
+ /* ->current must be initialized; rewind doesn't set it and valid
1656
+ * doesn't check whether it's set */
1657
+ iterator -> current = object ;
1658
+ }
1659
+ zval_add_ref (& object );
1645
1660
1646
1661
return (zend_object_iterator * )iterator ;
1647
1662
}
@@ -1720,15 +1735,15 @@ static void spl_filesystem_dir_it_rewind(zend_object_iterator *iter TSRMLS_DC)
1720
1735
static void spl_filesystem_tree_it_dtor (zend_object_iterator * iter TSRMLS_DC )
1721
1736
{
1722
1737
spl_filesystem_iterator * iterator = (spl_filesystem_iterator * )iter ;
1723
- zval * zfree = (zval * )iterator -> intern .data ;
1724
1738
1725
- if (iterator -> current ) {
1726
- zval_ptr_dtor (& iterator -> current );
1739
+ if (iterator -> intern .data ) {
1740
+ zval * object = iterator -> intern .data ;
1741
+ zval_ptr_dtor (& object );
1742
+ } else {
1743
+ if (iterator -> current ) {
1744
+ zval_ptr_dtor (& iterator -> current );
1745
+ }
1727
1746
}
1728
- iterator -> intern .data = NULL ; /* mark as unused */
1729
- /* free twice as we add ref twice */
1730
- zval_ptr_dtor (& zfree );
1731
- zval_ptr_dtor (& zfree );
1732
1747
}
1733
1748
/* }}} */
1734
1749
@@ -1839,10 +1854,12 @@ zend_object_iterator *spl_filesystem_tree_get_iterator(zend_class_entry *ce, zva
1839
1854
dir_object = (spl_filesystem_object * )zend_object_store_get_object (object TSRMLS_CC );
1840
1855
iterator = spl_filesystem_object_to_iterator (dir_object );
1841
1856
1842
- Z_SET_REFCOUNT_P (object , Z_REFCOUNT_P (object ) + 2 );
1843
- iterator -> intern .data = (void * )object ;
1844
- iterator -> intern .funcs = & spl_filesystem_tree_it_funcs ;
1845
- iterator -> current = NULL ;
1857
+ /* initialize iterator if wasn't gotten before */
1858
+ if (iterator -> intern .data == NULL ) {
1859
+ iterator -> intern .data = object ;
1860
+ iterator -> intern .funcs = & spl_filesystem_tree_it_funcs ;
1861
+ }
1862
+ zval_add_ref (& object );
1846
1863
1847
1864
return (zend_object_iterator * )iterator ;
1848
1865
}
0 commit comments