[PATCH v8 02/14] libbb: implement clone_string_array

Nadav Tasher tashernadav at gmail.com
Sun Mar 9 23:55:24 UTC 2025


This commit implements the close_string_array() function,
which creates a heap allocated duplicate of a NULL terminated
string array.

Signed-off-by: Nadav Tasher <tashernadav at gmail.com>
---
 include/libbb.h            |  2 ++
 libbb/Kbuild.src           |  1 +
 libbb/clone_string_array.c | 29 +++++++++++++++++++++++++++++
 3 files changed, 32 insertions(+)
 create mode 100644 libbb/clone_string_array.c

diff --git a/include/libbb.h b/include/libbb.h
index 17ca36760..bc9a7f907 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -442,6 +442,8 @@ void *mmap_read(int fd, size_t size) FAST_FUNC;
 void *mmap_anon(size_t size) FAST_FUNC;
 void *xmmap_anon(size_t size) FAST_FUNC;
 
+char **clone_string_array(char *const *original) FAST_FUNC;
+
 #if defined(__x86_64__) || defined(i386)
 # define BB_ARCH_FIXED_PAGESIZE 4096
 #elif defined(__arm__) /* only 32bit, 64bit ARM has variable page size */
diff --git a/libbb/Kbuild.src b/libbb/Kbuild.src
index cb8d2c2ec..3dc339ff7 100644
--- a/libbb/Kbuild.src
+++ b/libbb/Kbuild.src
@@ -22,6 +22,7 @@ lib-y += bb_qsort.o
 lib-y += bb_strtonum.o
 lib-y += change_identity.o
 lib-y += chomp.o
+lib-y += clone_string_array.o
 lib-y += compare_string_array.o
 lib-y += concat_path_file.o
 lib-y += concat_subpath_file.o
diff --git a/libbb/clone_string_array.c b/libbb/clone_string_array.c
new file mode 100644
index 000000000..bc4245af1
--- /dev/null
+++ b/libbb/clone_string_array.c
@@ -0,0 +1,29 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * Licensed under GPLv2 or later, see file LICENSE in this source tree.
+ */
+#include "libbb.h"
+
+/*
+ * Create a new heap allocated clone of a NULL
+ * terminated string array.
+ */
+char **clone_string_array(char *const *original)
+{
+	char **copied_array, *const *temporary_pointer;
+
+	/* find the end of original array */
+	for (temporary_pointer = original; *temporary_pointer; ++temporary_pointer);
+
+	/* allocate a new char** */
+	copied_array = xmalloc(sizeof(char *) * (temporary_pointer - original + 1));
+
+	/* duplicate all strings */
+	for (temporary_pointer = original; *temporary_pointer; ++temporary_pointer)
+		copied_array[temporary_pointer - original] = xstrdup(*temporary_pointer);
+
+	/* make sure the copied array is terminated */
+	copied_array[temporary_pointer - original] = NULL;
+
+	return copied_array;
+}
\ No newline at end of file
-- 
2.43.0



More information about the busybox mailing list