helly           Thu Mar 13 19:45:22 2008 UTC

  Added files:                 
    /php-src/ext/spl/tests      dit_003.phpt 

  Modified files:              
    /php-src/ext/spl    spl_directory.c 
  Log:
  - Fix possible memory corruption
  
http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.c?r1=1.149&r2=1.150&diff_format=u
Index: php-src/ext/spl/spl_directory.c
diff -u php-src/ext/spl/spl_directory.c:1.149 
php-src/ext/spl/spl_directory.c:1.150
--- php-src/ext/spl/spl_directory.c:1.149       Wed Feb 13 12:01:16 2008
+++ php-src/ext/spl/spl_directory.c     Thu Mar 13 19:45:22 2008
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_directory.c,v 1.149 2008/02/13 12:01:16 helly Exp $ */
+/* $Id: spl_directory.c,v 1.150 2008/03/13 19:45:22 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
@@ -1403,10 +1403,11 @@
 static void spl_filesystem_dir_it_dtor(zend_object_iterator *iter TSRMLS_DC)
 {
        spl_filesystem_iterator *iterator = (spl_filesystem_iterator *)iter;
+       zval *zfree = (zval*)iterator->intern.data;
 
-       zval_ptr_dtor(&iterator->current);
-       zval_ptr_dtor((zval**)&iterator->intern.data);
        iterator->intern.data = NULL; /* mark as unused */
+       zval_ptr_dtor(&iterator->current);
+       zval_ptr_dtor(&zfree);
 }
 /* }}} */
 
@@ -1469,12 +1470,15 @@
 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->current) {
                zval_ptr_dtor(&iterator->current);
        }
-       zval_ptr_dtor((zval**)&iterator->intern.data);
        iterator->intern.data = NULL; /* mark as unused */
+       /* free twice as we add ref twice */
+       zval_ptr_dtor(&zfree);
+       zval_ptr_dtor(&zfree);
 }
 /* }}} */
 
@@ -1586,7 +1590,7 @@
        dir_object = 
(spl_filesystem_object*)zend_object_store_get_object(object TSRMLS_CC);
        iterator   = spl_filesystem_object_to_iterator(dir_object);
 
-       Z_ADDREF_P(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;

http://cvs.php.net/viewvc.cgi/php-src/ext/spl/tests/dit_003.phpt?view=markup&rev=1.1
Index: php-src/ext/spl/tests/dit_003.phpt
+++ php-src/ext/spl/tests/dit_003.phpt
--TEST--
SPL: FilesystemIterator and foreach
--SKIPIF--
<?php if (!extension_loaded("spl")) print "skip"; ?>
--FILE--
<?php
$count = 0;
foreach(new FilesystemIterator('CVS') as $ent)
{
        ++$count;
}
var_dump($count > 0);
?>
===DONE===
--EXPECTF--
bool(true)
===DONE===



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

Reply via email to