@@ -2042,22 +2042,21 @@ static void spl_filesystem_file_rewind(zval * this_ptr, spl_filesystem_object *i
20422042PHP_METHOD (SplFileObject , __construct )
20432043{
20442044 spl_filesystem_object * intern = spl_filesystem_from_obj (Z_OBJ_P (ZEND_THIS ));
2045+ zend_string * file_name = NULL ;
20452046 zend_string * open_mode = ZSTR_CHAR ('r' );
2047+ zval * stream_context = NULL ;
20462048 bool use_include_path = 0 ;
20472049 size_t path_len ;
20482050 zend_error_handling error_handling ;
20492051
2050- intern -> u .file .open_mode = ZSTR_CHAR ('r' );
2051-
2052- if (zend_parse_parameters (ZEND_NUM_ARGS (), "P|Sbr!" ,
2053- & intern -> file_name , & open_mode ,
2054- & use_include_path , & intern -> u .file .zcontext ) == FAILURE ) {
2055- intern -> u .file .open_mode = NULL ;
2056- intern -> file_name = NULL ;
2052+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "P|Sbr!" , & file_name , & open_mode , & use_include_path , & stream_context ) == FAILURE ) {
20572053 RETURN_THROWS ();
20582054 }
20592055
20602056 intern -> u .file .open_mode = zend_string_copy (open_mode );
2057+ /* file_name and zcontext are copied by spl_filesystem_file_open() */
2058+ intern -> file_name = file_name ;
2059+ intern -> u .file .zcontext = stream_context ;
20612060
20622061 /* spl_filesystem_file_open() can generate E_WARNINGs which we want to promote to exceptions */
20632062 zend_replace_error_handling (EH_THROW , spl_ce_RuntimeException , & error_handling );
@@ -2096,6 +2095,12 @@ PHP_METHOD(SplTempFileObject, __construct)
20962095 RETURN_THROWS ();
20972096 }
20982097
2098+ /* Prevent reinitialization of Object */
2099+ if (intern -> u .file .stream ) {
2100+ zend_throw_error (NULL , "Cannot call constructor twice" );
2101+ RETURN_THROWS ();
2102+ }
2103+
20992104 if (max_memory < 0 ) {
21002105 file_name = zend_string_init ("php://memory" , sizeof ("php://memory" )- 1 , 0 );
21012106 } else if (ZEND_NUM_ARGS ()) {
0 commit comments