@@ -214,18 +214,24 @@ static inline int spl_filesystem_object_get_file_name(spl_filesystem_object *int
214214 break ;
215215 case SPL_FS_DIR :
216216 {
217+ size_t name_len ;
217218 size_t path_len = 0 ;
218219 char * path = spl_filesystem_object_get_path (intern , & path_len );
220+
219221 if (intern -> file_name ) {
220222 zend_string_release (intern -> file_name );
221223 }
222224 /* if there is parent path, amend it, otherwise just use the given path as is */
225+ name_len = strlen (intern -> u .dir .entry .d_name );
223226 if (path_len == 0 ) {
224- intern -> file_name = zend_strpprintf (
225- 0 , "%s" , intern -> u .dir .entry .d_name );
227+ intern -> file_name = zend_string_init (intern -> u .dir .entry .d_name , name_len , 0 );
226228 } else {
227- intern -> file_name = zend_strpprintf (
228- 0 , "%s%c%s" , path , slash , intern -> u .dir .entry .d_name );
229+ zend_string * file_name = zend_string_alloc (path_len + 1 + name_len , 0 );
230+ memcpy (ZSTR_VAL (file_name ), path , path_len );
231+ ZSTR_VAL (file_name )[path_len ] = slash ;
232+ memcpy (ZSTR_VAL (file_name ) + path_len + 1 , intern -> u .dir .entry .d_name , name_len );
233+ ZSTR_VAL (file_name )[path_len + 1 + name_len ] = 0 ;
234+ intern -> file_name = file_name ;
229235 }
230236 }
231237 break ;
@@ -1495,10 +1501,16 @@ PHP_METHOD(RecursiveDirectoryIterator, getChildren)
14951501
14961502 subdir = Z_SPLFILESYSTEM_P (return_value );
14971503 if (subdir ) {
1504+ size_t name_len = strlen (intern -> u .dir .entry .d_name );
14981505 if (intern -> u .dir .sub_path && ZSTR_LEN (intern -> u .dir .sub_path )) {
1499- subdir -> u .dir .sub_path = zend_strpprintf (0 , "%s%c%s" , ZSTR_VAL (intern -> u .dir .sub_path ), slash , intern -> u .dir .entry .d_name );
1506+ zend_string * sub_path = zend_string_alloc (ZSTR_LEN (intern -> u .dir .sub_path ) + 1 + name_len , 0 );
1507+ memcpy (ZSTR_VAL (sub_path ), ZSTR_VAL (intern -> u .dir .sub_path ), ZSTR_LEN (intern -> u .dir .sub_path ));
1508+ ZSTR_VAL (sub_path )[ZSTR_LEN (intern -> u .dir .sub_path )] = slash ;
1509+ memcpy (ZSTR_VAL (sub_path ) + ZSTR_LEN (intern -> u .dir .sub_path ) + 1 , intern -> u .dir .entry .d_name , name_len );
1510+ ZSTR_VAL (sub_path )[ZSTR_LEN (intern -> u .dir .sub_path ) + 1 + name_len ] = 0 ;
1511+ subdir -> u .dir .sub_path = sub_path ;
15001512 } else {
1501- subdir -> u .dir .sub_path = zend_string_init (intern -> u .dir .entry .d_name , strlen ( intern -> u . dir . entry . d_name ) , 0 );
1513+ subdir -> u .dir .sub_path = zend_string_init (intern -> u .dir .entry .d_name , name_len , 0 );
15021514 }
15031515 subdir -> info_class = intern -> info_class ;
15041516 subdir -> file_class = intern -> file_class ;
0 commit comments