From 6b71fff6d04686f66a2d2d3d7b84dc7c5649a799 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Sat, 28 Mar 2026 19:45:18 +0530 Subject: [PATCH 1/2] ext/spl: zend_string_concat3() instead of manual memcpy for sub_path construction --- ext/spl/spl_directory.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 86e4b11334c81..7cf2e8d5208aa 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -1470,11 +1470,14 @@ PHP_METHOD(RecursiveDirectoryIterator, getChildren) if (subdir) { size_t name_len = strlen(intern->u.dir.entry.d_name); if (intern->u.dir.sub_path && ZSTR_LEN(intern->u.dir.sub_path)) { - zend_string *sub_path = zend_string_alloc(ZSTR_LEN(intern->u.dir.sub_path) + 1 + name_len, 0); - memcpy(ZSTR_VAL(sub_path), ZSTR_VAL(intern->u.dir.sub_path), ZSTR_LEN(intern->u.dir.sub_path)); - ZSTR_VAL(sub_path)[ZSTR_LEN(intern->u.dir.sub_path)] = slash; - memcpy(ZSTR_VAL(sub_path) + ZSTR_LEN(intern->u.dir.sub_path) + 1, intern->u.dir.entry.d_name, name_len); - ZSTR_VAL(sub_path)[ZSTR_LEN(intern->u.dir.sub_path) + 1 + name_len] = 0; + zend_string *sub_path = zend_string_concat3( + ZSTR_VAL(intern->u.dir.sub_path), + ZSTR_LEN(intern->u.dir.sub_path), + &slash, + 1, + intern->u.dir.entry.d_name, + name_len + ); subdir->u.dir.sub_path = sub_path; } else { subdir->u.dir.sub_path = zend_string_init(intern->u.dir.entry.d_name, name_len, 0); From 21b1a89b3d3fd260498e2e33d5d8a7fcb3bd99e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Sat, 28 Mar 2026 16:36:49 +0100 Subject: [PATCH 2/2] spl: Adjust `zend_string_concat3()` formatting --- ext/spl/spl_directory.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 7cf2e8d5208aa..daaba27cbfc6d 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -1471,12 +1471,9 @@ PHP_METHOD(RecursiveDirectoryIterator, getChildren) size_t name_len = strlen(intern->u.dir.entry.d_name); if (intern->u.dir.sub_path && ZSTR_LEN(intern->u.dir.sub_path)) { zend_string *sub_path = zend_string_concat3( - ZSTR_VAL(intern->u.dir.sub_path), - ZSTR_LEN(intern->u.dir.sub_path), - &slash, - 1, - intern->u.dir.entry.d_name, - name_len + ZSTR_VAL(intern->u.dir.sub_path), ZSTR_LEN(intern->u.dir.sub_path), + &slash, 1, + intern->u.dir.entry.d_name, name_len ); subdir->u.dir.sub_path = sub_path; } else {