Commit f0f75a3d authored by Gunnar Kudrjavets's avatar Gunnar Kudrjavets Committed by Jarkko Sakkinen
Browse files

tpm2-sessions: Fix missing tpm_buf_destroy() in tpm2_read_public()



tpm2_read_public() calls tpm_buf_init() but fails to call
tpm_buf_destroy() on two exit paths, leaking a page allocation:

1. When name_size() returns an error (unrecognized hash algorithm),
   the function returns directly without destroying the buffer.

2. On the success path, the buffer is never destroyed before
   returning.

All other error paths in the function correctly call
tpm_buf_destroy() before returning.

Fix both by adding the missing tpm_buf_destroy() calls.

Cc: stable@vger.kernel.org # v6.19+
Fixes: bda1cbf7 ("tpm2-sessions: Fix tpm2_read_public range checks")
Signed-off-by: default avatarGunnar Kudrjavets <gunnarku@amazon.com>
Reviewed-by: default avatarJustinien Bouron <jbouron@amazon.com>
Reviewed-by: default avatarPaul Menzel <pmenzel@molgen.mpg.de>
Reviewed-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
Signed-off-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
parent 666c1a2c
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -203,8 +203,10 @@ static int tpm2_read_public(struct tpm_chip *chip, u32 handle, void *name)
	rc = tpm_buf_read_u16(&buf, &offset);
	name_size_alg = name_size(&buf.data[offset]);

	if (name_size_alg < 0)
	if (name_size_alg < 0) {
		tpm_buf_destroy(&buf);
		return name_size_alg;
	}

	if (rc != name_size_alg) {
		tpm_buf_destroy(&buf);
@@ -217,6 +219,7 @@ static int tpm2_read_public(struct tpm_chip *chip, u32 handle, void *name)
	}

	memcpy(name, &buf.data[offset], rc);
	tpm_buf_destroy(&buf);
	return name_size_alg;
}
#endif /* CONFIG_TCG_TPM2_HMAC */