Message ID | 20210412160101.1627882-1-colin.king@canonical.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [next] KEYS: trusted: Fix missing null return from kzalloc call | expand |
On Mon, 2021-04-12 at 17:01 +0100, Colin King wrote: > From: Colin Ian King <colin.king@canonical.com> > > 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@canonical.com> > --- > 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@linaro.org> 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? James
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@canonical.com> >> >> 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@canonical.com> >> --- >> 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@linaro.org> > 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 > >
On Mon, 12 Apr 2021 at 21:31, Colin King <colin.king@canonical.com> wrote: > > From: Colin Ian King <colin.king@canonical.com> > > 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@canonical.com> > --- > security/keys/trusted-keys/trusted_core.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > Ah, it's my bad. Thanks for fixing this issue. Reviewed-by: Sumit Garg <sumit.garg@linaro.org> -Sumit > 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; > } > > -- > 2.30.2 >
On Mon, 12 Apr 2021 at 22:34, Colin Ian King <colin.king@canonical.com> 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@canonical.com> > >> > >> 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@canonical.com> > >> --- > >> 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@linaro.org> > > 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 > > > > >
On Mon, Apr 12, 2021 at 05:01:01PM +0100, Colin King wrote: > From: Colin Ian King <colin.king@canonical.com> > > 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@canonical.com> Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org> /Jarkko
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; }