Commit 02614a25992 for php.net

commit 02614a25992f642aa040a97d388f292e4122d77f
Author: Arshid <arshidkv12@gmail.com>
Date:   Sat Mar 28 22:17:05 2026 +0530

    ext/spl: zend_string_concat3() instead of manual memcpy for sub_path construction (#21564)

    * ext/spl: zend_string_concat3() instead of manual memcpy for sub_path construction

    * spl: Adjust `zend_string_concat3()` formatting

    ---------

    Co-authored-by: Tim Düsterhus <tim@bastelstu.be>

diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c
index 86e4b11334c..daaba27cbfc 100644
--- a/ext/spl/spl_directory.c
+++ b/ext/spl/spl_directory.c
@@ -1470,11 +1470,11 @@ 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);