]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
lib/dbwrap: allow dbwrap_merge_dbufs() to update an existing buffer
authorStefan Metzmacher <metze@samba.org>
Sat, 10 Sep 2022 15:33:31 +0000 (17:33 +0200)
committerJeremy Allison <jra@samba.org>
Tue, 20 Sep 2022 00:34:35 +0000 (00:34 +0000)
This will be useful in future...

BUG: https://bugzilla.samba.org/show_bug.cgi?id=15125

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
lib/dbwrap/dbwrap.c
lib/dbwrap/dbwrap.h
lib/dbwrap/dbwrap_rbt.c
source3/lib/dbwrap/dbwrap_ctdb.c

index 7555efaa3ab19b1f9d2981601ee0dceb6f708a8d..9bdbd67dce1882723229549ac71e20ffb58ed386 100644 (file)
@@ -680,22 +680,28 @@ static ssize_t tdb_data_buf(const TDB_DATA *dbufs, int num_dbufs,
 }
 
 
-TDB_DATA dbwrap_merge_dbufs(TALLOC_CTX *mem_ctx,
+NTSTATUS dbwrap_merge_dbufs(TDB_DATA *buf, TALLOC_CTX *mem_ctx,
                            const TDB_DATA *dbufs, int num_dbufs)
 {
        ssize_t len = tdb_data_buf(dbufs, num_dbufs, NULL, 0);
-       uint8_t *buf;
 
        if (len == -1) {
-               return (TDB_DATA) {0};
+               return NT_STATUS_INVALID_PARAMETER;
        }
 
-       buf = talloc_array(mem_ctx, uint8_t, len);
-       if (buf == NULL) {
-               return (TDB_DATA) {0};
+       if (buf->dsize != len) {
+               uint8_t *tmp;
+
+               tmp = talloc_realloc(mem_ctx, buf->dptr, uint8_t, len);
+               if (tmp == NULL && len != 0) {
+                       return NT_STATUS_NO_MEMORY;
+               }
+
+               buf->dptr = tmp;
+               buf->dsize = len;
        }
 
-       tdb_data_buf(dbufs, num_dbufs, buf, len);
+       tdb_data_buf(dbufs, num_dbufs, buf->dptr, buf->dsize);
 
-       return (TDB_DATA) { .dptr = buf, .dsize = len };
+       return NT_STATUS_OK;
 }
index 9b8bf811ca6cb083922a33ff9a8b3dbb004b7ab2..cfae403b178a6f4d8b5996a737010b468416defb 100644 (file)
@@ -222,7 +222,7 @@ NTSTATUS dbwrap_parse_marshall_buf(const uint8_t *buf, size_t buflen,
 NTSTATUS dbwrap_unmarshall(struct db_context *db, const uint8_t *buf,
                           size_t buflen);
 
-TDB_DATA dbwrap_merge_dbufs(TALLOC_CTX *mem_ctx,
+NTSTATUS dbwrap_merge_dbufs(TDB_DATA *buf, TALLOC_CTX *mem_ctx,
                            const TDB_DATA *dbufs, int num_dbufs);
 
 
index db456dfffba1ba25c02e07ff686003e6e6868a7e..691acef688d2e52f3b8d0a8a2e3bdbbbca357fb8 100644 (file)
@@ -149,9 +149,12 @@ static NTSTATUS db_rbt_storev(struct db_record *rec,
        if (num_dbufs == 1) {
                data = dbufs[0];
        } else {
-               data = dbwrap_merge_dbufs(rec, dbufs, num_dbufs);
-               if (data.dptr == NULL) {
-                       return NT_STATUS_NO_MEMORY;
+               NTSTATUS status;
+
+               data = (TDB_DATA) {0};
+               status = dbwrap_merge_dbufs(&data, rec, dbufs, num_dbufs);
+               if (!NT_STATUS_IS_OK(status)) {
+                       return status;
                }
                to_free = data.dptr;
        }
index c0af5729f3220cbfe24ebbec3fde6ab0b22c24cc..1f0907c91a88d36de29e46b374178638f66ea3c1 100644 (file)
@@ -674,11 +674,11 @@ static NTSTATUS db_ctdb_storev_transaction(
        struct db_ctdb_transaction_handle *h = talloc_get_type_abort(
                rec->private_data, struct db_ctdb_transaction_handle);
        NTSTATUS status;
-       TDB_DATA data;
+       TDB_DATA data = {0};
 
-       data = dbwrap_merge_dbufs(rec, dbufs, num_dbufs);
-       if (data.dptr == NULL) {
-               return NT_STATUS_NO_MEMORY;
+       status = dbwrap_merge_dbufs(&data, rec, dbufs, num_dbufs);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
        }
 
        status = db_ctdb_transaction_store(h, rec->key, data);