From: Pavel Filipenský Date: Wed, 3 Dec 2025 16:47:57 +0000 (+0100) Subject: lib/util: Add data_blob_..._s() functions that call talloc_keep_secret() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2ed6217dbcef5c345518e9caa90ee33ececbe3f2;p=thirdparty%2Fsamba.git lib/util: Add data_blob_..._s() functions that call talloc_keep_secret() Signed-off-by: Pavel Filipenský Reviewed-by: Andreas Schneider --- diff --git a/lib/util/data_blob.h b/lib/util/data_blob.h index 87a522ccd9a..1196eb52eb1 100644 --- a/lib/util/data_blob.h +++ b/lib/util/data_blob.h @@ -33,6 +33,7 @@ #include #include #include +#include "lib/util/talloc_keep_secret.h" /** * @defgroup data_blob The data_blob API @@ -121,6 +122,41 @@ DATA_BLOB data_blob_talloc_zero(TALLOC_CTX *mem_ctx, size_t size); _data_blob_talloc_zero((ctx), (size), "DATA_BLOB: " __location__) #endif +#ifdef DOXYGEN +/** + * @brief Construct a data blob using supplied TALLOC_CTX. + * Data is initialized with zeros and zeroed out when freed. + */ +DATA_BLOB data_blob_talloc_zero_s(TALLOC_CTX *mem_ctx, size_t size); +#else +#define data_blob_talloc_zero_s(ctx, size) \ + _data_blob_talloc_zero_s((ctx), (size), "DATA_BLOB: " __location__) +#endif + +#ifdef DOXYGEN +/** + * @brief Construct a data blob using supplied TALLOC_CTX. + * You can pass NULL for ptr and get a blank data blob. + * Data is zeroed out when freed. + */ +DATA_BLOB data_blob_talloc_s(TALLOC_CTX *mem_ctx, const void *ptr, size_t size); +#else +#define data_blob_talloc_s(ctx, ptr, size) \ + _data_blob_talloc_s((ctx), (ptr), (size), "DATA_BLOB: " __location__) +#endif + +#ifdef DOXYGEN +/** + * @brief Construct a data blob using supplied TALLOC_CTX. + * Data is initialized using provided blob. + * Data is zeroed out when freed. + */ +DATA_BLOB data_blob_dup_talloc_s(TALLOC_CTX *mem_ctx, DATA_BLOB blob); +#else +#define data_blob_dup_talloc_s(ctx, blob) \ + _data_blob_dup_talloc_s((ctx), (blob), "DATA_BLOB: " __location__) +#endif + /** free a data blob **/ @@ -147,6 +183,41 @@ static inline DATA_BLOB _data_blob_talloc_zero(TALLOC_CTX *ctx, return b; } +static inline DATA_BLOB _data_blob_talloc_s(TALLOC_CTX *ctx, + const void *p, + size_t size, + const char *name) +{ + DATA_BLOB b = data_blob_talloc_named(ctx, p, size, name); + if (b.data != NULL) { + talloc_keep_secret(b.data); + } + return b; +} + +static inline DATA_BLOB _data_blob_talloc_zero_s(TALLOC_CTX *ctx, + size_t size, + const char *name) +{ + DATA_BLOB b = data_blob_talloc_named(ctx, 0, size, name); + if (b.data != NULL) { + data_blob_clear(&b); + talloc_keep_secret(b.data); + } + return b; +} + +static inline DATA_BLOB _data_blob_dup_talloc_s(TALLOC_CTX *ctx, + DATA_BLOB blob, + const char *name) +{ + DATA_BLOB b = data_blob_talloc_named(ctx, blob.data, blob.length, name); + if (b.data != NULL) { + talloc_keep_secret(b.data); + } + return b; +} + /** check if two data blobs are equal **/