From: Paul Meyer Date: Tue, 21 Jul 2026 13:06:37 +0000 (+0200) Subject: pcrextend: pass iovecs through the extend helpers X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1472ccebe70d2c0c48e077e7f00ab9d766f7455f;p=thirdparty%2Fsystemd.git pcrextend: pass iovecs through the extend helpers extend_pcr_now(), extend_nvpcr_now() and escape_and_truncate_data() took a (void *data, size_t) pair, even though both the dispatch layer and tpm2_{pcr,nvpcr}_extend_bytes() already speak struct iovec. Drop the pointless deconstruct/reassemble and pass the iovec through directly. Signed-off-by: Paul Meyer --- diff --git a/src/pcrextend/pcrextend.c b/src/pcrextend/pcrextend.c index 6c87f244f8b..132f20b101b 100644 --- a/src/pcrextend/pcrextend.c +++ b/src/pcrextend/pcrextend.c @@ -233,21 +233,22 @@ static int determine_banks(Tpm2Context *c, uint32_t target_pcr_mask) { return 0; } -static int escape_and_truncate_data(const void *data, size_t size, char **ret) { +static int escape_and_truncate_data(const struct iovec *data, char **ret) { _cleanup_free_ char *safe = NULL; - assert(data || size == 0); + assert(data); + assert(iovec_is_valid(data)); assert(ret); - if (size > EXTENSION_STRING_SAFE_LIMIT) { - safe = cescape_length(data, EXTENSION_STRING_SAFE_LIMIT); + if (data->iov_len > EXTENSION_STRING_SAFE_LIMIT) { + safe = cescape_length(data->iov_base, EXTENSION_STRING_SAFE_LIMIT); if (!safe) return -ENOMEM; if (!strextend(&safe, "...")) return -ENOMEM; } else { - safe = cescape_length(data, size); + safe = cescape_length(data->iov_base, data->iov_len); if (!safe) return -ENOMEM; } @@ -300,8 +301,7 @@ static int tpm2_context_new_for_measurement(Tpm2Context **ret) { static int extend_pcr_now( uint32_t pcr_mask, - const void *data, - size_t size, + const struct iovec *data, Tpm2UserspaceEventType event) { _cleanup_(tpm2_context_unrefp) Tpm2Context *c = NULL; @@ -325,13 +325,13 @@ static int extend_pcr_now( return log_oom(); _cleanup_free_ char *safe = NULL; - if (escape_and_truncate_data(data, size, &safe) < 0) + if (escape_and_truncate_data(data, &safe) < 0) return log_oom(); BIT_FOREACH(pcr, pcr_mask) { log_debug("Measuring '%s' into PCR index %i, banks %s.", safe, pcr, joined_banks); - r = tpm2_pcr_extend_bytes(c, arg_banks, pcr, &IOVEC_MAKE(data, size), /* secret= */ NULL, event, safe); + r = tpm2_pcr_extend_bytes(c, arg_banks, pcr, data, /* secret= */ NULL, event, safe); if (r < 0) return log_error_errno(r, "Could not extend PCR: %m"); @@ -348,8 +348,7 @@ static int extend_pcr_now( static int extend_nvpcr_now( const char *name, - const void *data, - size_t size, + const struct iovec *data, Tpm2UserspaceEventType event) { _cleanup_(tpm2_context_unrefp) Tpm2Context *c = NULL; @@ -362,7 +361,7 @@ static int extend_nvpcr_now( return r; _cleanup_free_ char *safe = NULL; - if (escape_and_truncate_data(data, size, &safe) < 0) + if (escape_and_truncate_data(data, &safe) < 0) return log_oom(); log_debug("Measuring '%s' into NvPCR index '%s'.", safe, name); @@ -371,7 +370,7 @@ static int extend_nvpcr_now( c, /* session= */ NULL, name, - &IOVEC_MAKE(data, size), + data, /* secret= */ NULL, event, safe); @@ -457,13 +456,13 @@ static int vl_method_extend(sd_varlink *link, sd_json_variant *parameters, sd_va return sd_varlink_error_invalid_parameter_name(link, p.text ? "text" : "data"); if (p.nvpcr) { - r = extend_nvpcr_now(p.nvpcr, extend_iovec->iov_base, extend_iovec->iov_len, p.event_type); + r = extend_nvpcr_now(p.nvpcr, extend_iovec, p.event_type); if (IN_SET(r, -ENOENT, -ENODEV)) return sd_varlink_error(link, "io.systemd.PCRExtend.NoSuchNvPCR", NULL); if (r == -ENOBUFS) return sd_varlink_error(link, "io.systemd.PCRExtend.NvPCRSpaceExhausted", NULL); } else - r = extend_pcr_now(INDEX_TO_MASK(uint32_t, p.pcr), extend_iovec->iov_base, extend_iovec->iov_len, p.event_type); + r = extend_pcr_now(INDEX_TO_MASK(uint32_t, p.pcr), extend_iovec, p.event_type); if (r < 0) return r; @@ -594,9 +593,9 @@ static int run(int argc, char *argv[]) { } if (arg_nvpcr_name) - r = extend_nvpcr_now(arg_nvpcr_name, word, strlen(word), event); + r = extend_nvpcr_now(arg_nvpcr_name, &IOVEC_MAKE(word, strlen(word)), event); else - r = extend_pcr_now(arg_pcr_mask, word, strlen(word), event); + r = extend_pcr_now(arg_pcr_mask, &IOVEC_MAKE(word, strlen(word)), event); /* Both extend paths report "TPM cannot be used for this measurement" (no PCR bank, missing crypto, * no TPM device — see tpm2_context_new_for_measurement()) as -EOPNOTSUPP. Under --graceful we skip * those rather than fail and block boot. Genuine faults keep their own errno and are never