On Thu, 12 Dec 2019 at 23:28, James Bottomley <James.Bottomley@xxxxxxxxxxxxxxxxxxxxx> wrote: > > The original code, before it was moved into security/keys/trusted-keys > had a flush after the blob unseal. Without that flush, the volatile > handles increase in the TPM until it becomes unusable and the system > either has to be rebooted or the TPM volatile area manually flushed. > Fix by adding back the lost flush, which we now have to export because > of the relocation of the trusted key code may cause the consumer to be > modular. > > Signed-off-by: James Bottomley <James.Bottomley@xxxxxxxxxxxxxxxxxxxxx> > Fixes: 2e19e10131a0 ("KEYS: trusted: Move TPM2 trusted keys code") > Overall looks good to me with following minor comment. > --- > drivers/char/tpm/tpm.h | 1 - > drivers/char/tpm/tpm2-cmd.c | 1 + > include/linux/tpm.h | 1 + > security/keys/trusted-keys/trusted_tpm2.c | 1 + > 4 files changed, 3 insertions(+), 1 deletion(-) > > diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h > index b9e1547be6b5..5620747da0cf 100644 > --- a/drivers/char/tpm/tpm.h > +++ b/drivers/char/tpm/tpm.h > @@ -218,7 +218,6 @@ int tpm2_pcr_read(struct tpm_chip *chip, u32 pcr_idx, > int tpm2_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, > struct tpm_digest *digests); > int tpm2_get_random(struct tpm_chip *chip, u8 *dest, size_t max); > -void tpm2_flush_context(struct tpm_chip *chip, u32 handle); > ssize_t tpm2_get_tpm_pt(struct tpm_chip *chip, u32 property_id, > u32 *value, const char *desc); > > diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c > index fdb457704aa7..13696deceae8 100644 > --- a/drivers/char/tpm/tpm2-cmd.c > +++ b/drivers/char/tpm/tpm2-cmd.c > @@ -362,6 +362,7 @@ void tpm2_flush_context(struct tpm_chip *chip, u32 handle) > tpm_transmit_cmd(chip, &buf, 0, "flushing context"); > tpm_buf_destroy(&buf); > } > +EXPORT_SYMBOL_GPL(tpm2_flush_context); > > struct tpm2_get_cap_out { > u8 more_data; > diff --git a/include/linux/tpm.h b/include/linux/tpm.h > index 0d6e949ba315..03e9b184411b 100644 > --- a/include/linux/tpm.h > +++ b/include/linux/tpm.h > @@ -403,6 +403,7 @@ extern int tpm_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, > extern int tpm_send(struct tpm_chip *chip, void *cmd, size_t buflen); > extern int tpm_get_random(struct tpm_chip *chip, u8 *data, size_t max); > extern struct tpm_chip *tpm_default_chip(void); > +void tpm2_flush_context(struct tpm_chip *chip, u32 handle); Shouldn't this be declared as "extern" similar to other APIs? Also, I think we need "#else" part for this API as well. -Sumit > #else > static inline int tpm_is_tpm2(struct tpm_chip *chip) > { > diff --git a/security/keys/trusted-keys/trusted_tpm2.c b/security/keys/trusted-keys/trusted_tpm2.c > index a9810ac2776f..08ec7f48f01d 100644 > --- a/security/keys/trusted-keys/trusted_tpm2.c > +++ b/security/keys/trusted-keys/trusted_tpm2.c > @@ -309,6 +309,7 @@ int tpm2_unseal_trusted(struct tpm_chip *chip, > return rc; > > rc = tpm2_unseal_cmd(chip, payload, options, blob_handle); > + tpm2_flush_context(chip, blob_handle); > > return rc; > } > -- > 2.16.4 >