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);