On Mon, 12 Apr 2021 at 22:34, Colin Ian King <colin.king@xxxxxxxxxxxxx> wrote: > > On 12/04/2021 17:48, James Bottomley wrote: > > On Mon, 2021-04-12 at 17:01 +0100, Colin King wrote: > >> From: Colin Ian King <colin.king@xxxxxxxxxxxxx> > >> > >> 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 <colin.king@xxxxxxxxxxxxx> > >> --- > >> security/keys/trusted-keys/trusted_core.c | 6 ++++-- > >> 1 file changed, 4 insertions(+), 2 deletions(-) > >> > >> diff --git a/security/keys/trusted-keys/trusted_core.c > >> b/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 <sumit.garg@xxxxxxxxxx> > > 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? It was a little more than just cut and paste where I did generalized "migratable" flag to be provided by the corresponding trust source's ops struct. > > 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. > I agree that extraction into trusted_core.c was a complex change but this patch has been up for review for almost 2 years [1]. And extensive testing can't catch this sort of bug as allocation wouldn't normally fail. [1] https://lwn.net/Articles/795416/ -Sumit > > James > > > > >