Commit:    a89c4a34ee55686ab1430a5060e1460335fc5203
Author:    Stanislav Malyshev <s...@php.net>         Thu, 22 Mar 2012 22:29:50 
-0700
Parents:   7164175e8576144562d9062c4625bcbaa4d670e2
Branches:  master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=a89c4a34ee55686ab1430a5060e1460335fc5203

Log:
Revert "- Fixed bug #61418 (Segmentation fault when DirectoryIterator's or" - 
causes bug #61482

This reverts commit 714f1ff4b37c5101b3c61ea108a3d415f41e50df.

Bugs:
https://bugs.php.net/61418
https://bugs.php.net/61482

Changed paths:
  M  ext/spl/spl_directory.c
  D  ext/spl/tests/bug61418.phpt


Diff:
a89c4a34ee55686ab1430a5060e1460335fc5203
diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c
index fb19823..f0e903f 100755
--- a/ext/spl/spl_directory.c
+++ b/ext/spl/spl_directory.c
@@ -120,16 +120,6 @@ static void spl_filesystem_object_free_storage(void 
*object TSRMLS_DC) /* {{{ */
                spl_filesystem_file_free_line(intern TSRMLS_CC);
                break;
        }
-
-       {
-               zend_object_iterator *iterator;
-               iterator = (zend_object_iterator*)
-                               spl_filesystem_object_to_iterator(intern);
-               if (iterator->data != NULL) {
-                       iterator->data = NULL;
-                       iterator->funcs->dtor(iterator TSRMLS_CC);
-               }
-       }
        efree(object);
 } /* }}} */
 
@@ -1637,15 +1627,10 @@ zend_object_iterator 
*spl_filesystem_dir_get_iterator(zend_class_entry *ce, zval
        dir_object = 
(spl_filesystem_object*)zend_object_store_get_object(object TSRMLS_CC);
        iterator   = spl_filesystem_object_to_iterator(dir_object);
 
-       /* initialize iterator if it wasn't gotten before */
-       if (iterator->intern.data == NULL) {
-               iterator->intern.data = object;
-               iterator->intern.funcs = &spl_filesystem_dir_it_funcs;
-               /* ->current must be initialized; rewind doesn't set it and 
valid
-                * doesn't check whether it's set */
-               iterator->current = object;
-       }
-       zval_add_ref(&object);
+       Z_SET_REFCOUNT_P(object, Z_REFCOUNT_P(object) + 2);
+       iterator->intern.data = (void*)object;
+       iterator->intern.funcs = &spl_filesystem_dir_it_funcs;
+       iterator->current = object;
        
        return (zend_object_iterator*)iterator;
 }
@@ -1724,15 +1709,15 @@ static void 
spl_filesystem_dir_it_rewind(zend_object_iterator *iter TSRMLS_DC)
 static void spl_filesystem_tree_it_dtor(zend_object_iterator *iter TSRMLS_DC)
 {
        spl_filesystem_iterator *iterator = (spl_filesystem_iterator *)iter;
+       zval *zfree = (zval*)iterator->intern.data;
 
-       if (iterator->intern.data) {
-               zval *object =  iterator->intern.data;
-               zval_ptr_dtor(&object);
-       } else {
-               if (iterator->current) {
-                       zval_ptr_dtor(&iterator->current);
-               }
+       if (iterator->current) {
+               zval_ptr_dtor(&iterator->current);
        }
+       iterator->intern.data = NULL; /* mark as unused */
+       /* free twice as we add ref twice */
+       zval_ptr_dtor(&zfree);
+       zval_ptr_dtor(&zfree);
 }
 /* }}} */
 
@@ -1843,12 +1828,10 @@ zend_object_iterator 
*spl_filesystem_tree_get_iterator(zend_class_entry *ce, zva
        dir_object = 
(spl_filesystem_object*)zend_object_store_get_object(object TSRMLS_CC);
        iterator   = spl_filesystem_object_to_iterator(dir_object);
 
-       /* initialize iterator if wasn't gotten before */
-       if (iterator->intern.data == NULL) {
-               iterator->intern.data = object;
-               iterator->intern.funcs = &spl_filesystem_tree_it_funcs;
-       }
-       zval_add_ref(&object);
+       Z_SET_REFCOUNT_P(object, Z_REFCOUNT_P(object) + 2);
+       iterator->intern.data = (void*)object;
+       iterator->intern.funcs = &spl_filesystem_tree_it_funcs;
+       iterator->current = NULL;
        
        return (zend_object_iterator*)iterator;
 }
diff --git a/ext/spl/tests/bug61418.phpt b/ext/spl/tests/bug61418.phpt
deleted file mode 100644
index c5d9db9..0000000
--- a/ext/spl/tests/bug61418.phpt
+++ /dev/null
@@ -1,23 +0,0 @@
---TEST--
-Bug #61418: Segmentation fault using FiltesystemIterator & RegexIterator
---FILE--
-<?php
-$fileIterator = new FilesystemIterator(__DIR__, 
FilesystemIterator::KEY_AS_FILENAME);
-$regexpIterator = new RegexIterator($fileIterator, '#.*#');
-foreach ($fileIterator as $key => $file)
-{
-}
-unset($regexpIterator);
-unset($fileIterator);
-
-$dirIterator = new DirectoryIterator(__DIR__);
-$regexpIterator2 = new RegexIterator($dirIterator, '#.*#');
-foreach ($dirIterator as $key => $file)
-{
-}
-unset($regexpIterator2);
-unset($dirIterator);
-?>
-==DONE==
---EXPECT--
-==DONE==


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to