'tpm2_load_cmd' allocates a tempoary blob indirectly via 'tpm2_key_decode'
but it is not freed in the failure paths. Address this by wrapping the blob
into with a cleanup helper.

Cc: [email protected] # v5.13+
Fixes: f2219745250f ("security: keys: trusted: use ASN.1 TPM2 key format for 
the blobs")
Signed-off-by: Jarkko Sakkinen <[email protected]>
---
v9:
- Fixed up the commit message. It was not up to date and referred to wrong
  function.
- Simplified the patch considereably. It was not optimally small.
v8:
- No changes.
v7:
- Fix compiler warning.
v6:
- A new patch in this version.
---
 security/keys/trusted-keys/trusted_tpm2.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/security/keys/trusted-keys/trusted_tpm2.c 
b/security/keys/trusted-keys/trusted_tpm2.c
index 4467e880ebd5..225b8c9932bf 100644
--- a/security/keys/trusted-keys/trusted_tpm2.c
+++ b/security/keys/trusted-keys/trusted_tpm2.c
@@ -366,6 +366,7 @@ static int tpm2_load_cmd(struct tpm_chip *chip,
                         struct trusted_key_options *options,
                         u32 *blob_handle)
 {
+       u8 *blob_ref __free(kfree) = NULL;
        struct tpm_buf buf;
        unsigned int private_len;
        unsigned int public_len;
@@ -379,6 +380,9 @@ static int tpm2_load_cmd(struct tpm_chip *chip,
                /* old form */
                blob = payload->blob;
                payload->old_format = 1;
+       } else {
+               /* Bind for cleanup: */
+               blob_ref = blob;
        }
 
        /* new format carries keyhandle but old format doesn't */
@@ -443,8 +447,6 @@ static int tpm2_load_cmd(struct tpm_chip *chip,
                        (__be32 *) &buf.data[TPM_HEADER_SIZE]);
 
 out:
-       if (blob != payload->blob)
-               kfree(blob);
        tpm_buf_destroy(&buf);
 
        return tpm_ret_to_err(rc);
-- 
2.52.0


Reply via email to