@@ -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
@@ -1627,10 +1637,15 @@ zend_object_iterator *spl_filesystem_dir_get_iterator(zend_class_entry *ce, zval
1627
1637
dir_object = (spl_filesystem_object * )zend_object_store_get_object (object TSRMLS_CC );
1628
1638
iterator = spl_filesystem_object_to_iterator (dir_object );
1629
1639
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 ;
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 );
1634
1649
1635
1650
return (zend_object_iterator * )iterator ;
1636
1651
}
@@ -1709,15 +1724,15 @@ static void spl_filesystem_dir_it_rewind(zend_object_iterator *iter TSRMLS_DC)
1709
1724
static void spl_filesystem_tree_it_dtor (zend_object_iterator * iter TSRMLS_DC )
1710
1725
{
1711
1726
spl_filesystem_iterator * iterator = (spl_filesystem_iterator * )iter ;
1712
- zval * zfree = (zval * )iterator -> intern .data ;
1713
1727
1714
- if (iterator -> current ) {
1715
- zval_ptr_dtor (& iterator -> current );
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
+ }
1716
1735
}
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 );
1721
1736
}
1722
1737
/* }}} */
1723
1738
@@ -1828,10 +1843,12 @@ zend_object_iterator *spl_filesystem_tree_get_iterator(zend_class_entry *ce, zva
1828
1843
dir_object = (spl_filesystem_object * )zend_object_store_get_object (object TSRMLS_CC );
1829
1844
iterator = spl_filesystem_object_to_iterator (dir_object );
1830
1845
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 ;
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 );
1835
1852
1836
1853
return (zend_object_iterator * )iterator ;
1837
1854
}
0 commit comments