Re: [PATCH] tpm: Fix memory leak in tpmm_chip_alloc

From: Guozihua (Scott)
Date: Mon Mar 14 2022 - 03:10:48 EST




On 2022/3/12 0:34, Jarkko Sakkinen wrote:
On Thu, 2022-03-10 at 11:33 +0800, Guozihua (Scott) wrote:


On 2022/3/7 21:45, Jarkko Sakkinen wrote:
On Mon, Mar 07, 2022 at 06:48:27PM +0800, GUO Zihua wrote:
Fix a memory leak in tpmm_chip_alloc. devm_add_action_or_reset would
call put_device on error, while tpm->devs is left untouched. Call
put_device on tpm->devs as well if devm_add_action_or_reset returns an
error.

Fixes: fdc915f7f719 ("tpm: expose spaces via a device link /dev/tpmrm")
Signed-off-by: GUO Zihua <guozihua@xxxxxxxxxx>
---
  drivers/char/tpm/tpm-chip.c | 13 +++++++++----
  1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
index b009e7479b70..0a92334e8c40 100644
--- a/drivers/char/tpm/tpm-chip.c
+++ b/drivers/char/tpm/tpm-chip.c
@@ -308,6 +308,12 @@ static int tpm_class_shutdown(struct device *dev)
        return 0;
  }
+static void tpm_chip_free(struct tpm_chip *chip)
+{
+       put_device(&chip->devs);
+       put_device(&chip->dev);
+}
+
  /**
   * tpm_chip_alloc() - allocate a new struct tpm_chip instance
   * @pdev: device to which the chip is associated
@@ -396,8 +402,7 @@ struct tpm_chip *tpm_chip_alloc(struct device *pdev,
        return chip;
  out:
-       put_device(&chip->devs);
-       put_device(&chip->dev);
+       tpm_chip_free(chip);
        return ERR_PTR(rc);
  }
  EXPORT_SYMBOL_GPL(tpm_chip_alloc);
@@ -420,8 +425,8 @@ struct tpm_chip *tpmm_chip_alloc(struct device *pdev,
                return chip;
        rc = devm_add_action_or_reset(pdev,
-                                     (void (*)(void *)) put_device,
-                                     &chip->dev);
+                                     (void (*)(void *)) tpm_chip_free,
+                                     chip);
        if (rc)
                return ERR_PTR(rc);
--
2.17.1


Please test against the latest in

git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd.git

and share your results.

BR, Jarkko
.

Hi Jarkko,

I'll do that. Do we have a test set for TPM? Or do we just build and run
it and see if everything works as expected?

This is an error handling optimization BTW.

There is kselftest in tools/testing/kselftes/tpm2 that you can use
but do not have to.

BR, Jarkko



Great! Thanks Jarkko!

--
Best
GUO Zihua