Skip to content

Commit bcc15b5

Browse files
committed
Merge branch 'PHP-5.3' into PHP-5.4
* PHP-5.3: Revert "- Fixed bug #61418 (Segmentation fault when DirectoryIterator's or" - causes bug #61482 Add initialization tests for SQLT_INT binds Fix NEWS
2 parents ee755fa + a89c4a3 commit bcc15b5

File tree

2 files changed

+15
-55
lines changed

2 files changed

+15
-55
lines changed

Diff for: ext/spl/spl_directory.c

+15-32
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

@@ -1648,15 +1638,10 @@ zend_object_iterator *spl_filesystem_dir_get_iterator(zend_class_entry *ce, zval
16481638
dir_object = (spl_filesystem_object*)zend_object_store_get_object(object TSRMLS_CC);
16491639
iterator = spl_filesystem_object_to_iterator(dir_object);
16501640

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);
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;
16601645

16611646
return (zend_object_iterator*)iterator;
16621647
}
@@ -1735,15 +1720,15 @@ static void spl_filesystem_dir_it_rewind(zend_object_iterator *iter TSRMLS_DC)
17351720
static void spl_filesystem_tree_it_dtor(zend_object_iterator *iter TSRMLS_DC)
17361721
{
17371722
spl_filesystem_iterator *iterator = (spl_filesystem_iterator *)iter;
1723+
zval *zfree = (zval*)iterator->intern.data;
17381724

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-
}
1725+
if (iterator->current) {
1726+
zval_ptr_dtor(&iterator->current);
17461727
}
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);
17471732
}
17481733
/* }}} */
17491734

@@ -1854,12 +1839,10 @@ zend_object_iterator *spl_filesystem_tree_get_iterator(zend_class_entry *ce, zva
18541839
dir_object = (spl_filesystem_object*)zend_object_store_get_object(object TSRMLS_CC);
18551840
iterator = spl_filesystem_object_to_iterator(dir_object);
18561841

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);
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;
18631846

18641847
return (zend_object_iterator*)iterator;
18651848
}

Diff for: ext/spl/tests/bug61418.phpt

-23
This file was deleted.

0 commit comments

Comments
 (0)