@@ -222,19 +222,22 @@ static zend_object *spl_filesystem_object_new_check(zend_class_entry *class_type
222
222
}
223
223
/* }}} */
224
224
225
- PHPAPI char * spl_filesystem_object_get_path (spl_filesystem_object * intern , size_t * len ) /* {{{ */
225
+ PHPAPI zend_string * spl_filesystem_object_get_path (spl_filesystem_object * intern ) /* {{{ */
226
226
{
227
227
#ifdef HAVE_GLOB
228
- if (intern -> type == SPL_FS_DIR ) {
229
- if (php_stream_is (intern -> u .dir .dirp ,& php_glob_stream_ops )) {
230
- return php_glob_stream_get_path (intern -> u .dir .dirp , len );
228
+ if (intern -> type == SPL_FS_DIR && php_stream_is (intern -> u .dir .dirp , & php_glob_stream_ops )) {
229
+ size_t len = 0 ;
230
+ char * tmp = php_glob_stream_get_path (intern -> u .dir .dirp , & len );
231
+ if (len == 0 ) {
232
+ return NULL ;
231
233
}
234
+ return zend_string_init (tmp , len , /* persistent */ false);
232
235
}
233
236
#endif
234
- if (len ) {
235
- * len = intern -> path ? ZSTR_LEN ( intern -> path ) : 0 ;
237
+ if (! intern -> path ) {
238
+ return NULL ;
236
239
}
237
- return intern -> path ? ZSTR_VAL (intern -> path ) : NULL ;
240
+ return zend_string_copy (intern -> path );
238
241
} /* }}} */
239
242
240
243
static inline zend_result spl_filesystem_object_get_file_name (spl_filesystem_object * intern ) /* {{{ */
@@ -249,29 +252,25 @@ static inline zend_result spl_filesystem_object_get_file_name(spl_filesystem_obj
249
252
case SPL_FS_FILE :
250
253
zend_throw_error (NULL , "Object not initialized" );
251
254
return FAILURE ;
252
- break ;
253
- case SPL_FS_DIR :
254
- {
255
- size_t name_len ;
256
- size_t path_len = 0 ;
257
- char * path ;
258
- char slash = SPL_HAS_FLAG (intern -> flags , SPL_FILE_DIR_UNIXPATHS ) ? '/' : DEFAULT_SLASH ;
259
-
260
- path = spl_filesystem_object_get_path (intern , & path_len );
261
- /* if there is parent path, amend it, otherwise just use the given path as is */
262
- name_len = strlen (intern -> u .dir .entry .d_name );
263
- if (path_len == 0 ) {
264
- intern -> file_name = zend_string_init (intern -> u .dir .entry .d_name , name_len , 0 );
265
- } else {
266
- zend_string * file_name = zend_string_alloc (path_len + 1 + name_len , 0 );
267
- memcpy (ZSTR_VAL (file_name ), path , path_len );
268
- ZSTR_VAL (file_name )[path_len ] = slash ;
269
- memcpy (ZSTR_VAL (file_name ) + path_len + 1 , intern -> u .dir .entry .d_name , name_len );
270
- ZSTR_VAL (file_name )[path_len + 1 + name_len ] = 0 ;
271
- intern -> file_name = file_name ;
272
- }
255
+ case SPL_FS_DIR : {
256
+ size_t name_len ;
257
+ zend_string * path ;
258
+ char slash = SPL_HAS_FLAG (intern -> flags , SPL_FILE_DIR_UNIXPATHS ) ? '/' : DEFAULT_SLASH ;
259
+
260
+ path = spl_filesystem_object_get_path (intern );
261
+ /* if there is parent path, amend it, otherwise just use the given path as is */
262
+ name_len = strlen (intern -> u .dir .entry .d_name );
263
+ if (!path ) {
264
+ intern -> file_name = zend_string_init (intern -> u .dir .entry .d_name , name_len , 0 );
265
+ return SUCCESS ;
273
266
}
267
+
268
+ ZEND_ASSERT (ZSTR_LEN (path ) != 0 );
269
+ intern -> file_name = zend_string_concat3 (
270
+ ZSTR_VAL (path ), ZSTR_LEN (path ), & slash , 1 , intern -> u .dir .entry .d_name , name_len );
271
+ zend_string_release_ex (path , /* persistent */ false);
274
272
break ;
273
+ }
275
274
}
276
275
return SUCCESS ;
277
276
} /* }}} */
@@ -545,16 +544,8 @@ static spl_filesystem_object *spl_filesystem_object_create_type(int num_args, sp
545
544
zend_call_method_with_1_params (Z_OBJ_P (return_value ), ce , & ce -> constructor , "__construct" , NULL , & arg1 );
546
545
zval_ptr_dtor (& arg1 );
547
546
} else {
548
- char * path ;
549
- size_t path_len ;
550
-
551
547
intern -> file_name = zend_string_copy (source -> file_name );
552
- path = spl_filesystem_object_get_path (source , & path_len );
553
- if (source -> path && ZSTR_VAL (source -> path ) == path ) {
554
- intern -> path = zend_string_copy (source -> path );
555
- } else {
556
- intern -> path = zend_string_init (path , path_len , 0 );
557
- }
548
+ intern -> path = spl_filesystem_object_get_path (source );
558
549
}
559
550
break ;
560
551
case SPL_FS_FILE :
@@ -584,17 +575,8 @@ static spl_filesystem_object *spl_filesystem_object_create_type(int num_args, sp
584
575
zval_ptr_dtor (& arg1 );
585
576
zval_ptr_dtor (& arg2 );
586
577
} else {
587
- char * path ;
588
- size_t path_len ;
589
-
590
578
intern -> file_name = source -> file_name ;
591
- path = spl_filesystem_object_get_path (source , & path_len );
592
- if (source -> path && ZSTR_VAL (source -> path ) == path ) {
593
- intern -> path = zend_string_copy (source -> path );
594
- } else {
595
- intern -> path = zend_string_init (path , path_len , 0 );
596
- }
597
-
579
+ intern -> path = spl_filesystem_object_get_path (source );
598
580
intern -> u .file .open_mode = zend_string_copy (open_mode );
599
581
intern -> u .file .zcontext = resource ;
600
582
@@ -664,18 +646,19 @@ static inline HashTable *spl_filesystem_object_get_debug_info(zend_object *objec
664
646
zend_string_release_ex (pnstr , 0 );
665
647
666
648
if (intern -> file_name ) {
667
- size_t path_len ;
649
+ zend_string * path ;
668
650
669
651
pnstr = spl_gen_private_prop_name (spl_ce_SplFileInfo , "fileName" , sizeof ("fileName" )- 1 );
670
- spl_filesystem_object_get_path (intern , & path_len );
652
+ path = spl_filesystem_object_get_path (intern );
671
653
672
- if (path_len && path_len < ZSTR_LEN (intern -> file_name )) {
673
- ZVAL_STRINGL (& tmp , ZSTR_VAL (intern -> file_name ) + path_len + 1 , ZSTR_LEN (intern -> file_name ) - (path_len + 1 ));
654
+ if (ZSTR_LEN ( path ) && ZSTR_LEN ( path ) < ZSTR_LEN (intern -> file_name )) {
655
+ ZVAL_STRINGL (& tmp , ZSTR_VAL (intern -> file_name ) + ZSTR_LEN ( path ) + 1 , ZSTR_LEN (intern -> file_name ) - (ZSTR_LEN ( path ) + 1 ));
674
656
} else {
675
657
ZVAL_STR_COPY (& tmp , intern -> file_name );
676
658
}
677
659
zend_symtable_update (rv , pnstr , & tmp );
678
- zend_string_release_ex (pnstr , 0 );
660
+ zend_string_release_ex (pnstr , /* persistent */ false);
661
+ zend_string_release_ex (path , /* persistent */ false);
679
662
}
680
663
if (intern -> type == SPL_FS_DIR ) {
681
664
#ifdef HAVE_GLOB
@@ -905,16 +888,15 @@ PHP_METHOD(DirectoryIterator, valid)
905
888
PHP_METHOD (SplFileInfo , getPath )
906
889
{
907
890
spl_filesystem_object * intern = spl_filesystem_from_obj (Z_OBJ_P (ZEND_THIS ));
908
- char * path ;
909
- size_t path_len ;
891
+ zend_string * path ;
910
892
911
893
if (zend_parse_parameters_none () == FAILURE ) {
912
894
RETURN_THROWS ();
913
895
}
914
896
915
- path = spl_filesystem_object_get_path (intern , & path_len );
897
+ path = spl_filesystem_object_get_path (intern );
916
898
if (path ) {
917
- RETURN_STRINGL (path , path_len );
899
+ RETURN_STR (path );
918
900
} else {
919
901
RETURN_EMPTY_STRING ();
920
902
}
@@ -925,7 +907,7 @@ PHP_METHOD(SplFileInfo, getPath)
925
907
PHP_METHOD (SplFileInfo , getFilename )
926
908
{
927
909
spl_filesystem_object * intern = spl_filesystem_from_obj (Z_OBJ_P (ZEND_THIS ));
928
- size_t path_len ;
910
+ zend_string * path ;
929
911
930
912
if (zend_parse_parameters_none () == FAILURE ) {
931
913
RETURN_THROWS ();
@@ -936,13 +918,15 @@ PHP_METHOD(SplFileInfo, getFilename)
936
918
RETURN_THROWS ();
937
919
}
938
920
939
- spl_filesystem_object_get_path (intern , & path_len );
921
+ path = spl_filesystem_object_get_path (intern );
940
922
941
- if (path_len && path_len < ZSTR_LEN (intern -> file_name )) {
942
- RETURN_STRINGL (ZSTR_VAL (intern -> file_name ) + path_len + 1 , ZSTR_LEN (intern -> file_name ) - (path_len + 1 ));
923
+ if (path && ZSTR_LEN (path ) < ZSTR_LEN (intern -> file_name )) {
924
+ size_t path_len = ZSTR_LEN (path );
925
+ RETVAL_STRINGL (ZSTR_VAL (intern -> file_name ) + path_len + 1 , ZSTR_LEN (intern -> file_name ) - (path_len + 1 ));
943
926
} else {
944
- RETURN_STR_COPY (intern -> file_name );
927
+ RETVAL_STR_COPY (intern -> file_name );
945
928
}
929
+ zend_string_release_ex (path , /* persistent */ false);
946
930
}
947
931
/* }}} */
948
932
@@ -967,7 +951,7 @@ PHP_METHOD(SplFileInfo, getExtension)
967
951
char * fname = NULL ;
968
952
const char * p ;
969
953
size_t flen ;
970
- size_t path_len ;
954
+ zend_string * path ;
971
955
size_t idx ;
972
956
zend_string * ret ;
973
957
@@ -980,15 +964,16 @@ PHP_METHOD(SplFileInfo, getExtension)
980
964
RETURN_THROWS ();
981
965
}
982
966
983
- spl_filesystem_object_get_path (intern , & path_len );
967
+ path = spl_filesystem_object_get_path (intern );
984
968
985
- if (path_len && path_len < ZSTR_LEN (intern -> file_name )) {
986
- fname = ZSTR_VAL (intern -> file_name ) + path_len + 1 ;
987
- flen = ZSTR_LEN (intern -> file_name ) - (path_len + 1 );
969
+ if (ZSTR_LEN ( path ) && ZSTR_LEN ( path ) < ZSTR_LEN (intern -> file_name )) {
970
+ fname = ZSTR_VAL (intern -> file_name ) + ZSTR_LEN ( path ) + 1 ;
971
+ flen = ZSTR_LEN (intern -> file_name ) - (ZSTR_LEN ( path ) + 1 );
988
972
} else {
989
973
fname = ZSTR_VAL (intern -> file_name );
990
974
flen = ZSTR_LEN (intern -> file_name );
991
975
}
976
+ zend_string_release_ex (path , /* persistent */ false);
992
977
993
978
ret = php_basename (fname , flen , NULL , 0 );
994
979
@@ -1038,7 +1023,8 @@ PHP_METHOD(SplFileInfo, getBasename)
1038
1023
spl_filesystem_object * intern = spl_filesystem_from_obj (Z_OBJ_P (ZEND_THIS ));
1039
1024
char * fname , * suffix = 0 ;
1040
1025
size_t flen ;
1041
- size_t slen = 0 , path_len ;
1026
+ size_t slen = 0 ;
1027
+ zend_string * path ;
1042
1028
1043
1029
if (zend_parse_parameters (ZEND_NUM_ARGS (), "|s" , & suffix , & slen ) == FAILURE ) {
1044
1030
RETURN_THROWS ();
@@ -1049,15 +1035,16 @@ PHP_METHOD(SplFileInfo, getBasename)
1049
1035
RETURN_THROWS ();
1050
1036
}
1051
1037
1052
- spl_filesystem_object_get_path (intern , & path_len );
1038
+ path = spl_filesystem_object_get_path (intern );
1053
1039
1054
- if (path_len && path_len < ZSTR_LEN (intern -> file_name )) {
1055
- fname = ZSTR_VAL (intern -> file_name ) + path_len + 1 ;
1056
- flen = ZSTR_LEN (intern -> file_name ) - (path_len + 1 );
1040
+ if (path && ZSTR_LEN ( path ) < ZSTR_LEN (intern -> file_name )) {
1041
+ fname = ZSTR_VAL (intern -> file_name ) + ZSTR_LEN ( path ) + 1 ;
1042
+ flen = ZSTR_LEN (intern -> file_name ) - (ZSTR_LEN ( path ) + 1 );
1057
1043
} else {
1058
1044
fname = ZSTR_VAL (intern -> file_name );
1059
1045
flen = ZSTR_LEN (intern -> file_name );
1060
1046
}
1047
+ zend_string_release_ex (path , /* persistent */ false);
1061
1048
1062
1049
RETURN_STR (php_basename (fname , flen , suffix , slen ));
1063
1050
}
0 commit comments