History

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()

Linus Torvalds committed 2 years ago

Commit fa8151c2 parents 38da32e 050bf3c1 file · +19 −6Browse files

Unified · Split

security/keys/trusted-keys/trusted_tpm2.c+19−6
@@ -38,6 +38,7 @@ static int tpm2_key_encode(struct trusted_key_payload *payload, · 37 unmodified lines
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, · 13 unmodified lines
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, · 4 unmodified lines
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, · 2 unmodified lines
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 {