Commit:    bcc15b56331f3055c99d8c126a61f48b33229c1c
Author:    Stanislav Malyshev <s...@php.net>         Thu, 22 Mar 2012 22:30:51 
-0700
Parents:   ee755fafb99ba618fd82bbe05758ace68584ded1 
a89c4a34ee55686ab1430a5060e1460335fc5203
Branches:  master

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

Log:
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

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

Changed paths:
  MM  ext/spl/spl_directory.c

bcc15b56331f3055c99d8c126a61f48b33229c1c
diff --combined ext/spl/spl_directory.c
index c6eec94,f0e903f..22d4ffa
--- a/ext/spl/spl_directory.c
+++ b/ext/spl/spl_directory.c
@@@ -120,16 -120,6 +120,6 @@@ static void spl_filesystem_object_free_
                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);
  } /* }}} */
  
@@@ -148,6 -138,7 +138,6 @@@ static zend_object_value spl_filesystem
  {
        zend_object_value retval;
        spl_filesystem_object *intern;
 -      zval *tmp;
  
        intern = emalloc(sizeof(spl_filesystem_object));
        memset(intern, 0, sizeof(spl_filesystem_object));
@@@ -157,7 -148,7 +147,7 @@@
        if (obj) *obj = intern;
  
        zend_object_std_init(&intern->std, class_type TSRMLS_CC);
 -      zend_hash_copy(intern->std.properties, &class_type->default_properties, 
(copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *));
 +      object_properties_init(&intern->std, class_type);
  
        retval.handle = zend_objects_store_put(intern, 
(zend_objects_store_dtor_t) zend_objects_destroy_object, 
(zend_objects_free_object_storage_t) spl_filesystem_object_free_storage, NULL 
TSRMLS_CC);
        retval.handlers = &spl_filesystem_object_handlers;
@@@ -244,7 -235,7 +234,7 @@@ static void spl_filesystem_dir_open(spl
  
        intern->type = SPL_FS_DIR;
        intern->_path_len = strlen(path);
 -      intern->u.dir.dirp = php_stream_opendir(path, 
ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL);
 +      intern->u.dir.dirp = php_stream_opendir(path, REPORT_ERRORS, 
FG(default_context));
  
        if (intern->_path_len > 1 && IS_SLASH_AT(path, intern->_path_len-1)) {
                intern->_path = estrndup(path, --intern->_path_len);
@@@ -270,20 -261,9 +260,20 @@@
  
  static int spl_filesystem_file_open(spl_filesystem_object *intern, int 
use_include_path, int silent TSRMLS_DC) /* {{{ */
  {
 +      zval  tmp;
 +
        intern->type = SPL_FS_FILE;
 +
 +      php_stat(intern->file_name, intern->file_name_len, FS_IS_DIR, &tmp 
TSRMLS_CC);
 +      if (Z_LVAL(tmp)) {
 +              intern->u.file.open_mode = NULL;
 +              intern->file_name = NULL;
 +              zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC, 
"Cannot use SplFileObject with directories");
 +              return FAILURE;
 +      }
 +
        intern->u.file.context = 
php_stream_context_from_zval(intern->u.file.zcontext, 0);
 -      intern->u.file.stream = php_stream_open_wrapper_ex(intern->file_name, 
intern->u.file.open_mode, (use_include_path ? USE_PATH : 0) | ENFORCE_SAFE_MODE 
| REPORT_ERRORS, NULL, intern->u.file.context);
 +      intern->u.file.stream = php_stream_open_wrapper_ex(intern->file_name, 
intern->u.file.open_mode, (use_include_path ? USE_PATH : 0) | REPORT_ERRORS, 
NULL, intern->u.file.context);
  
        if (!intern->file_name_len || !intern->u.file.stream) {
                if (!EG(exception)) {
@@@ -595,10 -575,6 +585,10 @@@ static HashTable* spl_filesystem_object
  
        *is_temp = 1;
  
 +      if (!intern->std.properties) {
 +              rebuild_object_properties(&intern->std);
 +      }
 +
        ALLOC_HASHTABLE(rv);
        ZEND_INIT_SYMTABLE_EX(rv, 
zend_hash_num_elements(intern->std.properties) + 3, 0);
  
@@@ -660,17 -636,16 +650,17 @@@
  }
  /* }}} */
  
 -zend_function *spl_filesystem_object_get_method_check(zval **object_ptr, char 
*method, int method_len TSRMLS_DC) /* {{{ */
 +zend_function *spl_filesystem_object_get_method_check(zval **object_ptr, char 
*method, int method_len, const struct _zend_literal *key TSRMLS_DC) /* {{{ */
  {
        spl_filesystem_object *fsobj = zend_object_store_get_object(*object_ptr 
TSRMLS_CC);
        
        if (fsobj->u.dir.entry.d_name[0] == '\0' && fsobj->orig_path == NULL) {
                method = "_bad_state_ex";
                method_len = sizeof("_bad_state_ex") - 1;
 +              key = NULL;
        }
        
 -      return zend_get_std_object_handlers()->get_method(object_ptr, method, 
method_len TSRMLS_CC);
 +      return zend_get_std_object_handlers()->get_method(object_ptr, method, 
method_len, key TSRMLS_CC);
  }
  /* }}} */
  
@@@ -1252,7 -1227,11 +1242,7 @@@ SPL_METHOD(SplFileInfo, getLinkTarget
                RETURN_FALSE;
        } else if (!IS_ABSOLUTE_PATH(intern->file_name, intern->file_name_len)) 
{
                char expanded_path[MAXPATHLEN];
 -
 -              /* TODO: Fix expand_filepath to do not resolve links but only 
expand the path
 -                 avoiding double two resolution attempts
 -                 (Pierre) */
 -              if (!expand_filepath(intern->file_name, expanded_path 
TSRMLS_CC)) {
 +              if (!expand_filepath_with_mode(intern->file_name, 
expanded_path, NULL, 0, CWD_EXPAND  TSRMLS_CC)) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "No such 
file or directory");
                        RETURN_FALSE;
                }
@@@ -1648,15 -1627,10 +1638,10 @@@ zend_object_iterator *spl_filesystem_di
        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;
  }
@@@ -1735,15 -1709,15 +1720,15 @@@ static void spl_filesystem_dir_it_rewin
  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);
  }
  /* }}} */
  
@@@ -1854,12 -1828,10 +1839,10 @@@ zend_object_iterator *spl_filesystem_tr
        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;
  }
@@@ -2040,6 -2012,7 +2023,6 @@@ static int spl_filesystem_file_read(spl
  {
        char *buf;
        size_t line_len = 0;
 -      int len;
        long line_add = (intern->u.file.current_line || 
intern->u.file.current_zval) ? 1 : 0;
  
        spl_filesystem_file_free_line(intern TSRMLS_CC);
@@@ -2072,6 -2045,11 +2055,6 @@@
                        buf[line_len] = '\0';
                }
        
 -              if (PG(magic_quotes_runtime)) {
 -                      buf = php_addslashes(buf, line_len, &len, 1 TSRMLS_CC);
 -                      line_len = len;
 -              }
 -      
                intern->u.file.current_line = buf;
                intern->u.file.current_line_len = line_len;
        }
@@@ -2279,7 -2257,7 +2262,7 @@@ SPL_METHOD(SplFileObject, __construct
        intern->u.file.open_mode = NULL;
        intern->u.file.open_mode_len = 0;
  
 -      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|sbr", 
 +      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|sbr", 
                        &intern->file_name, &intern->file_name_len,
                        &intern->u.file.open_mode, 
&intern->u.file.open_mode_len, 
                        &use_include_path, &intern->u.file.zcontext) == 
FAILURE) {              
@@@ -2293,7 -2271,7 +2276,7 @@@
                intern->u.file.open_mode = "r";
                intern->u.file.open_mode_len = 1;
        }
 -      
 +
        if (spl_filesystem_file_open(intern, use_include_path, 0 TSRMLS_CC) == 
SUCCESS) {
                tmp_path_len = strlen(intern->u.file.stream->orig_path);
  
@@@ -2481,9 -2459,7 +2464,9 @@@ SPL_METHOD(SplFileObject, setFlags
  {
        spl_filesystem_object *intern = 
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
  
 -      zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &intern->flags);
 +      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", 
&intern->flags) == FAILURE) {
 +              return;
 +      }
  } /* }}} */
  
  /* {{{ proto int SplFileObject::getFlags()
@@@ -2603,43 -2579,6 +2586,43 @@@ SPL_METHOD(SplFileObject, fgetcsv
  }
  /* }}} */
  
 +/* {{{ proto int SplFileObject::fputcsv(array fields, [string delimiter [, 
string enclosure]])
 +   Output a field array as a CSV line */
 +SPL_METHOD(SplFileObject, fputcsv)
 +{
 +      spl_filesystem_object *intern = 
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
 +      char delimiter = intern->u.file.delimiter, enclosure = 
intern->u.file.enclosure, escape = intern->u.file.escape;
 +      char *delim = NULL, *enclo = NULL;
 +      int d_len = 0, e_len = 0, ret;
 +      zval *fields = NULL;
 +      
 +      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|ss", &fields, 
&delim, &d_len, &enclo, &e_len) == SUCCESS) {
 +              switch(ZEND_NUM_ARGS())
 +              {
 +              case 3:
 +                      if (e_len != 1) {
 +                              php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"enclosure must be a character");
 +                              RETURN_FALSE;
 +                      }
 +                      enclosure = enclo[0];
 +                      /* no break */
 +              case 2:
 +                      if (d_len != 1) {
 +                              php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"delimiter must be a character");
 +                              RETURN_FALSE;
 +                      }
 +                      delimiter = delim[0];
 +                      /* no break */
 +              case 1:
 +              case 0:
 +                      break;
 +              }
 +              ret = php_fputcsv(intern->u.file.stream, fields, delimiter, 
enclosure, escape TSRMLS_CC);
 +              RETURN_LONG(ret);
 +      }
 +}
 +/* }}} */
 +
  /* {{{ proto void SplFileObject::setCsvControl([string delimiter = ',' [, 
string enclosure = '"' [, string escape = '\\']]])
     Set the delimiter and enclosure character used in fgetcsv */
  SPL_METHOD(SplFileObject, setCsvControl)
@@@ -2821,6 -2760,7 +2804,6 @@@ SPL_METHOD(SplFileObject, fwrite
        spl_filesystem_object *intern = 
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
        char *str;
        int str_len;
 -      int ret;
        long length = 0;
  
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &str, 
&str_len, &length) == FAILURE) {
@@@ -2834,6 -2774,14 +2817,6 @@@
                RETURN_LONG(0);
        }
  
 -      if (PG(magic_quotes_runtime)) {
 -              str = estrndup(str, str_len);
 -              php_stripslashes(str, &str_len TSRMLS_CC);
 -              ret = php_stream_write(intern->u.file.stream, str, str_len);
 -              efree(str);
 -              RETURN_LONG(ret);
 -      }
 -
        RETURN_LONG(php_stream_write(intern->u.file.stream, str, str_len));
  } /* }}} */
  
@@@ -2904,13 -2852,6 +2887,13 @@@ ZEND_END_ARG_INFO(
  ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fgetcsv, 0, 0, 0)
        ZEND_ARG_INFO(0, delimiter)
        ZEND_ARG_INFO(0, enclosure)
 +      ZEND_ARG_INFO(0, escape)
 +ZEND_END_ARG_INFO()
 +
 +ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fputcsv, 0, 0, 1)
 +      ZEND_ARG_INFO(0, fields)
 +      ZEND_ARG_INFO(0, delimiter)
 +      ZEND_ARG_INFO(0, enclosure)
  ZEND_END_ARG_INFO()
  
  ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_flock, 0, 0, 1) 
@@@ -2927,7 -2868,7 +2910,7 @@@ ZEND_BEGIN_ARG_INFO_EX(arginfo_file_obj
        ZEND_ARG_INFO(0, allowable_tags)
  ZEND_END_ARG_INFO()
  
 -ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fscanf, 1, 0, 1)
 +ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fscanf, 1, 0, 1) 
        ZEND_ARG_INFO(0, format)
  ZEND_END_ARG_INFO()
  
@@@ -2951,7 -2892,6 +2934,7 @@@ static const zend_function_entry spl_Sp
        SPL_ME(SplFileObject, valid,          arginfo_splfileinfo_void,         
 ZEND_ACC_PUBLIC)
        SPL_ME(SplFileObject, fgets,          arginfo_splfileinfo_void,         
 ZEND_ACC_PUBLIC)
        SPL_ME(SplFileObject, fgetcsv,        arginfo_file_object_fgetcsv,      
 ZEND_ACC_PUBLIC)
 +      SPL_ME(SplFileObject, fputcsv,        arginfo_file_object_fputcsv,      
 ZEND_ACC_PUBLIC)
        SPL_ME(SplFileObject, setCsvControl,  arginfo_file_object_fgetcsv,      
 ZEND_ACC_PUBLIC)
        SPL_ME(SplFileObject, getCsvControl,  arginfo_splfileinfo_void,         
 ZEND_ACC_PUBLIC)
        SPL_ME(SplFileObject, flock,          arginfo_file_object_flock,        
 ZEND_ACC_PUBLIC)
@@@ -3020,7 -2960,6 +3003,7 @@@ PHP_MINIT_FUNCTION(spl_directory
        REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "FOLLOW_SYMLINKS",    
 SPL_FILE_DIR_FOLLOW_SYMLINKS);
        REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "KEY_AS_FILENAME",    
 SPL_FILE_DIR_KEY_AS_FILENAME);
        REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, 
"NEW_CURRENT_AND_KEY", 
SPL_FILE_DIR_KEY_AS_FILENAME|SPL_FILE_DIR_CURRENT_AS_FILEINFO);
 +      REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "OTHER_MODE_MASK",    
 SPL_FILE_DIR_OTHERS_MASK);
        REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "SKIP_DOTS",          
 SPL_FILE_DIR_SKIPDOTS);
        REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "UNIX_PATHS",         
 SPL_FILE_DIR_UNIXPATHS);
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to