diff options
author | Stefan Metzmacher <metze@samba.org> | 2022-09-10 17:33:31 +0200 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2022-09-20 00:34:35 +0000 |
commit | 3c26ee84ce8bcd50e3788b1c4df5ebe2d101899c (patch) | |
tree | ce2f67c0330f52278eda3533cdb8b227effbc650 /lib/dbwrap | |
parent | 6f2ce1fd34642e56a68b0997decbf50255063ea4 (diff) | |
download | samba-3c26ee84ce8bcd50e3788b1c4df5ebe2d101899c.tar.gz |
lib/dbwrap: allow dbwrap_merge_dbufs() to update an existing buffer
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>
Diffstat (limited to 'lib/dbwrap')
-rw-r--r-- | lib/dbwrap/dbwrap.c | 22 | ||||
-rw-r--r-- | lib/dbwrap/dbwrap.h | 2 | ||||
-rw-r--r-- | lib/dbwrap/dbwrap_rbt.c | 9 |
3 files changed, 21 insertions, 12 deletions
diff --git a/lib/dbwrap/dbwrap.c b/lib/dbwrap/dbwrap.c index 7555efaa3ab..9bdbd67dce1 100644 --- a/lib/dbwrap/dbwrap.c +++ b/lib/dbwrap/dbwrap.c @@ -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; } diff --git a/lib/dbwrap/dbwrap.h b/lib/dbwrap/dbwrap.h index 9b8bf811ca6..cfae403b178 100644 --- a/lib/dbwrap/dbwrap.h +++ b/lib/dbwrap/dbwrap.h @@ -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); diff --git a/lib/dbwrap/dbwrap_rbt.c b/lib/dbwrap/dbwrap_rbt.c index db456dfffba..691acef688d 100644 --- a/lib/dbwrap/dbwrap_rbt.c +++ b/lib/dbwrap/dbwrap_rbt.c @@ -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; } |