Skip to content

Commit fa8151c

Browse files
committed
Merge tag 'keys-trusted-next-6.10-rc1-part2' of git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd
Pull trusted keys fixes from Jarkko Sakkinen: "These are two bugs I found from trusted keys while working on a new RSA key type for TPM2. Both originate form v5.13. The memory leak is more crucial but I don't think it is either good idea if kernel throws WARN when ASN.1 parser fails, even if it is related to programming error, as it is not that mature code yet. There's at least two WARN's in that code but I picked just the one more likely to trigger. Planning to fix the other one too over time" * tag 'keys-trusted-next-6.10-rc1-part2' of git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd: KEYS: trusted: Do not use WARN when encode fails KEYS: trusted: Fix memory leak in tpm2_key_encode()
2 parents 38da32e + 050bf3c commit fa8151c

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

security/keys/trusted-keys/trusted_tpm2.c

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ static int tpm2_key_encode(struct trusted_key_payload *payload,
3838
u8 *end_work = scratch + SCRATCH_SIZE;
3939
u8 *priv, *pub;
4040
u16 priv_len, pub_len;
41+
int ret;
4142

4243
priv_len = get_unaligned_be16(src) + 2;
4344
priv = src;
@@ -57,8 +58,10 @@ static int tpm2_key_encode(struct trusted_key_payload *payload,
5758
unsigned char bool[3], *w = bool;
5859
/* tag 0 is emptyAuth */
5960
w = asn1_encode_boolean(w, w + sizeof(bool), true);
60-
if (WARN(IS_ERR(w), "BUG: Boolean failed to encode"))
61-
return PTR_ERR(w);
61+
if (WARN(IS_ERR(w), "BUG: Boolean failed to encode")) {
62+
ret = PTR_ERR(w);
63+
goto err;
64+
}
6265
work = asn1_encode_tag(work, end_work, 0, bool, w - bool);
6366
}
6467

@@ -69,8 +72,10 @@ static int tpm2_key_encode(struct trusted_key_payload *payload,
6972
* trigger, so if it does there's something nefarious going on
7073
*/
7174
if (WARN(work - scratch + pub_len + priv_len + 14 > SCRATCH_SIZE,
72-
"BUG: scratch buffer is too small"))
73-
return -EINVAL;
75+
"BUG: scratch buffer is too small")) {
76+
ret = -EINVAL;
77+
goto err;
78+
}
7479

7580
work = asn1_encode_integer(work, end_work, options->keyhandle);
7681
work = asn1_encode_octet_string(work, end_work, pub, pub_len);
@@ -79,10 +84,18 @@ static int tpm2_key_encode(struct trusted_key_payload *payload,
7984
work1 = payload->blob;
8085
work1 = asn1_encode_sequence(work1, work1 + sizeof(payload->blob),
8186
scratch, work - scratch);
82-
if (WARN(IS_ERR(work1), "BUG: ASN.1 encoder failed"))
83-
return PTR_ERR(work1);
87+
if (IS_ERR(work1)) {
88+
ret = PTR_ERR(work1);
89+
pr_err("BUG: ASN.1 encoder failed with %d\n", ret);
90+
goto err;
91+
}
8492

93+
kfree(scratch);
8594
return work1 - payload->blob;
95+
96+
err:
97+
kfree(scratch);
98+
return ret;
8699
}
87100

88101
struct tpm2_key_context {

0 commit comments

Comments
 (0)