From c7896cecea8f5c1bedd9e0a69db4797ea60dc97a Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 23 Nov 2023 22:23:23 +0100 Subject: [PATCH] pcrextend: fix minor memory leak Also, simplify the code a bit by using json_dispatch_unbase64_iovec(). --- src/pcrextend/pcrextend.c | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/src/pcrextend/pcrextend.c b/src/pcrextend/pcrextend.c index 4ab7f55..1295949 100644 --- a/src/pcrextend/pcrextend.c +++ b/src/pcrextend/pcrextend.c @@ -247,35 +247,24 @@ static int extend_now(unsigned pcr, const void *data, size_t size, Tpm2Userspace typedef struct MethodExtendParameters { unsigned pcr; const char *text; - void *data; - size_t data_size; + struct iovec data; } MethodExtendParameters; -static int json_dispatch_binary_data(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) { - MethodExtendParameters *p = ASSERT_PTR(userdata); - _cleanup_free_ void *d = NULL; - size_t l; - int r; - - r = json_variant_unbase64(variant, &d, &l); - if (r < 0) - return json_log(variant, flags, r, "JSON variant is not a base64 string."); +static void method_extend_parameters_done(MethodExtendParameters *p) { + assert(p); - free_and_replace(p->data, d); - p->data_size = l; - - return 0; + iovec_done(&p->data); } static int vl_method_extend(Varlink *link, JsonVariant *parameters, VarlinkMethodFlags flags, void *userdata) { static const JsonDispatch dispatch_table[] = { - { "pcr", _JSON_VARIANT_TYPE_INVALID, json_dispatch_uint, offsetof(MethodExtendParameters, pcr), JSON_MANDATORY }, - { "text", JSON_VARIANT_STRING, json_dispatch_const_string, offsetof(MethodExtendParameters, text), 0 }, - { "data", JSON_VARIANT_STRING, json_dispatch_binary_data, 0, 0 }, + { "pcr", _JSON_VARIANT_TYPE_INVALID, json_dispatch_uint, offsetof(MethodExtendParameters, pcr), JSON_MANDATORY }, + { "text", JSON_VARIANT_STRING, json_dispatch_const_string, offsetof(MethodExtendParameters, text), 0 }, + { "data", JSON_VARIANT_STRING, json_dispatch_unbase64_iovec, offsetof(MethodExtendParameters, data), 0 }, {} }; - MethodExtendParameters p = { + _cleanup_(method_extend_parameters_done) MethodExtendParameters p = { .pcr = UINT_MAX, }; int r; @@ -291,12 +280,12 @@ static int vl_method_extend(Varlink *link, JsonVariant *parameters, VarlinkMetho if (p.text) { /* Specifying both the text string and the binary data is not allowed */ - if (p.data) + if (p.data.iov_base) return varlink_errorb(link, VARLINK_ERROR_INVALID_PARAMETER, JSON_BUILD_OBJECT(JSON_BUILD_PAIR_STRING("parameter", "data"))); r = extend_now(p.pcr, p.text, strlen(p.text), _TPM2_USERSPACE_EVENT_TYPE_INVALID); - } else if (p.data) - r = extend_now(p.pcr, p.data, p.data_size, _TPM2_USERSPACE_EVENT_TYPE_INVALID); + } else if (p.data.iov_base) + r = extend_now(p.pcr, p.data.iov_base, p.data.iov_len, _TPM2_USERSPACE_EVENT_TYPE_INVALID); else return varlink_errorb(link, VARLINK_ERROR_INVALID_PARAMETER, JSON_BUILD_OBJECT(JSON_BUILD_PAIR_STRING("parameter", "text"))); if (r < 0) -- 2.7.4