@@ -214,18 +214,24 @@ static inline int spl_filesystem_object_get_file_name(spl_filesystem_object *int
214
214
break ;
215
215
case SPL_FS_DIR :
216
216
{
217
+ size_t name_len ;
217
218
size_t path_len = 0 ;
218
219
char * path = spl_filesystem_object_get_path (intern , & path_len );
220
+
219
221
if (intern -> file_name ) {
220
222
zend_string_release (intern -> file_name );
221
223
}
222
224
/* 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 );
223
226
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 );
226
228
} 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 ;
229
235
}
230
236
}
231
237
break ;
@@ -1495,10 +1501,16 @@ PHP_METHOD(RecursiveDirectoryIterator, getChildren)
1495
1501
1496
1502
subdir = Z_SPLFILESYSTEM_P (return_value );
1497
1503
if (subdir ) {
1504
+ size_t name_len = strlen (intern -> u .dir .entry .d_name );
1498
1505
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 ;
1500
1512
} 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 );
1502
1514
}
1503
1515
subdir -> info_class = intern -> info_class ;
1504
1516
subdir -> file_class = intern -> file_class ;
0 commit comments