Re: [PATCH][next] KEYS: trusted: Fix missing null return from kzalloc call
From: Colin Ian King <hidden>
Date: 2021-04-12 17:05:12
Also in:
kernel-janitors, keyrings, linux-integrity, lkml
On 12/04/2021 17:48, James Bottomley wrote:
On Mon, 2021-04-12 at 17:01 +0100, Colin King wrote:quoted
From: Colin Ian King <redacted> The kzalloc call can return null with the GFP_KERNEL flag so add a null check and exit via a new error exit label. Use the same exit error label for another error path too. Addresses-Coverity: ("Dereference null return value") Fixes: 830027e2cb55 ("KEYS: trusted: Add generic trusted keys framework") Signed-off-by: Colin Ian King <redacted> --- security/keys/trusted-keys/trusted_core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)diff --git a/security/keys/trusted-keys/trusted_core.cb/security/keys/trusted-keys/trusted_core.c index ec3a066a4b42..90774793f0b1 100644--- a/security/keys/trusted-keys/trusted_core.c +++ b/security/keys/trusted-keys/trusted_core.c@@ -116,11 +116,13 @@ static struct trusted_key_payload*trusted_payload_alloc(struct key *key) ret = key_payload_reserve(key, sizeof(*p)); if (ret < 0) - return p; + goto err; p = kzalloc(sizeof(*p), GFP_KERNEL); + if (!p) + goto err; p->migratable = migratable; - +err: return p;This is clearly a code migration bug in commit 251c85bd106099e6f388a89e88e12d14de2c9cda Author: Sumit Garg [off-list ref] Date: Mon Mar 1 18:41:24 2021 +0530 KEYS: trusted: Add generic trusted keys framework Which has for addition to trusted_core.c: +static struct trusted_key_payload *trusted_payload_alloc(struct key *key) +{ + struct trusted_key_payload *p = NULL; + int ret; + + ret = key_payload_reserve(key, sizeof(*p)); + if (ret < 0) + return p; + p = kzalloc(sizeof(*p), GFP_KERNEL); + + p->migratable = migratable; + + return p; +} And for trusted_tpm1.c: -static struct trusted_key_payload *trusted_payload_alloc(struct key *key) -{ - struct trusted_key_payload *p = NULL; - int ret; - - ret = key_payload_reserve(key, sizeof *p); - if (ret < 0) - return p; - p = kzalloc(sizeof *p, GFP_KERNEL); - if (p) - p->migratable = 1; /* migratable by default */ - return p; -} The trusted_tpm1.c code was correct and we got this bug introduced by what should have been a simple cut and paste ... how did that happen? And therefore, how safe is the rest of the extraction into trusted_core.c?
fortunately it gets caught by static analysis, but it does make me also concerned about what else has changed and how this gets through review.
James