]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
abuf: Add a function to copy a buffer
authorSimon Glass <sjg@chromium.org>
Fri, 2 May 2025 14:46:03 +0000 (08:46 -0600)
committerSimon Glass <sjg@chromium.org>
Fri, 30 May 2025 08:49:31 +0000 (09:49 +0100)
It is useful to be able to copy an abuf, to allow changes while
preserving the original. Add a function for this.

Signed-off-by: Simon Glass <sjg@chromium.org>
include/abuf.h
lib/abuf.c
test/lib/abuf.c

index 749bb188b0c617b0bee3c661b9365dbb33d1be16..bbb3c51f334f0a117cd4896115840f2a4ad79152 100644 (file)
@@ -111,6 +111,17 @@ bool abuf_realloc(struct abuf *abuf, size_t new_size);
  */
 bool abuf_realloc_inc(struct abuf *abuf, size_t inc);
 
+/**
+ * abuf_copy() - Make a copy of an abuf
+ *
+ * Creates an allocated copy of @old in @new
+ *
+ * @old: abuf to copy
+ * @new: new abuf to hold the copy (inited by this function)
+ * Return: true if OK, false if out of memory
+ */
+bool abuf_copy(const struct abuf *old, struct abuf *new);
+
 /**
  * abuf_uninit_move() - Return the allocated contents and uninit the abuf
  *
index 3cbe320fb089b75787d9b4247d956300600d71c3..28c748acb9f52fc1c96845aa98f0e6a278874836 100644 (file)
@@ -128,6 +128,20 @@ bool abuf_init_size(struct abuf *buf, size_t size)
        return true;
 }
 
+bool abuf_copy(const struct abuf *old, struct abuf *copy)
+{
+       char *data;
+
+       data = malloc(old->size);
+       if (!data)
+               return false;
+       memcpy(data, old->data, old->size);
+       abuf_init_set(copy, data, old->size);
+       copy->alloced = true;
+
+       return true;
+}
+
 void abuf_init_const(struct abuf *abuf, const void *data, size_t size)
 {
        /* for now there is no flag indicating that the abuf data is constant */
index cdc86aad9888d48cb428a2a5e8373de9712836ae..96c77ed23792bc96c752f2341f29fdf43c1a3e28 100644 (file)
@@ -420,6 +420,29 @@ static int lib_test_abuf_init(struct unit_test_state *uts)
 }
 LIB_TEST(lib_test_abuf_init, 0);
 
+/* Test abuf_copy() */
+static int lib_test_abuf_copy(struct unit_test_state *uts)
+{
+       struct abuf buf, copy;
+       ulong start;
+
+       start = ut_check_free();
+
+       abuf_init_set(&buf, test_data, TEST_DATA_LEN);
+       ut_assert(abuf_copy(&buf, &copy));
+       ut_asserteq(buf.size, copy.size);
+       ut_assert(buf.data != copy.data);
+       ut_assert(copy.alloced);
+       abuf_uninit(&copy);
+       abuf_uninit(&buf);
+
+       /* Check for memory leaks */
+       ut_assertok(ut_check_delta(start));
+
+       return 0;
+}
+LIB_TEST(lib_test_abuf_copy, 0);
+
 /* Test abuf_init_size() */
 static int lib_test_abuf_init_size(struct unit_test_state *uts)
 {