All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jason Gunthorpe <jgg@ziepe.ca>
To: Javier Martinez Canillas <javierm@redhat.com>
Cc: linux-kernel@vger.kernel.org, James Ettle <james@ettle.org.uk>,
	Hans de Goede <hdegoede@redhat.com>,
	Azhar Shaikh <azhar.shaikh@intel.com>,
	Arnd Bergmann <arnd@arndb.de>,
	Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>,
	Peter Huewe <peterhuewe@gmx.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	linux-integrity@vger.kernel.org
Subject: Re: [PATCH 1/4] tpm: fix access attempt to an already unmapped I/O memory region
Date: Wed, 20 Dec 2017 11:08:55 -0700	[thread overview]
Message-ID: <20171220180855.GB22908@ziepe.ca> (raw)
In-Reply-To: <20171220113538.16099-2-javierm@redhat.com>

On Wed, Dec 20, 2017 at 12:35:35PM +0100, Javier Martinez Canillas wrote:
> The driver maps the I/O memory address to control the LPC bus CLKRUN_EN,
> but on the error path the memory is accessed by the .clk_enable handler
> after this was already unmapped. So only unmap the I/O memory region if
> it will not be used anymore.
> 
> Also, the correct thing to do is to cleanup the resources in the inverse
> order that were acquired to prevent issues like these.
> 
> Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
> 
>  drivers/char/tpm/tpm_tis_core.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c
> index c2227983ed88..3455abbb2035 100644
> +++ b/drivers/char/tpm/tpm_tis_core.c

Yoiks. This patch is helping but the more I look at this the wronger
everything looks..

1) tpm_chip_unregister makes chip->ops == NULL, so this sequence:

static int tpm_tis_plat_remove(struct platform_device *pdev)
	tpm_chip_unregister(chip);
	tpm_tis_remove(chip);
void tpm_tis_remove(struct tpm_chip *chip)
	if (chip->ops->clk_enable != NULL)

Will oops

2) tpm_chip_register can also NULL ops in error cases, so this
   sequence can oops:

       rc = tpm_chip_register(chip);
       if (rc && is_bsw())
               iounmap(priv->ilb_base_addr);

        if (chip->ops->clk_enable != NULL)
                chip->ops->clk_enable(chip, false);

3) iounmap should not be split between tpm_tis and tpm_tis_core
   Put it at the end of tpm_tis_remove.

4) This sequence:

+       return tpm_chip_register(chip);
+out_err:
+       tpm_tis_remove(chip);
+       return rc;

   Doesn't look right. If tpm_chip_register fails then
   tpm_tis_remove will never be called. This was sort of OK when
   tpm_tis_remove didn't manage any resources, but now that it does
   the above needs fixing too.

The below draft fixes everything except #1. That needs a more thoughtful
idea..

Jason

diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c
index d29add49b03388..09f18e2e644774 100644
--- a/drivers/char/tpm/tpm_tis.c
+++ b/drivers/char/tpm/tpm_tis.c
@@ -275,9 +275,6 @@ static void tpm_tis_pnp_remove(struct pnp_dev *dev)
 
 	tpm_chip_unregister(chip);
 	tpm_tis_remove(chip);
-	if (is_bsw())
-		iounmap(priv->ilb_base_addr);
-
 }
 
 static struct pnp_driver tis_pnp_driver = {
@@ -328,10 +325,6 @@ static int tpm_tis_plat_remove(struct platform_device *pdev)
 
 	tpm_chip_unregister(chip);
 	tpm_tis_remove(chip);
-
-	if (is_bsw())
-		iounmap(priv->ilb_base_addr);
-
 	return 0;
 }
 
diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c
index c2227983ed88d4..ffda1694a6aba3 100644
--- a/drivers/char/tpm/tpm_tis_core.c
+++ b/drivers/char/tpm/tpm_tis_core.c
@@ -727,6 +727,9 @@ void tpm_tis_remove(struct tpm_chip *chip)
 
 	if (chip->ops->clk_enable != NULL)
 		chip->ops->clk_enable(chip, false);
+
+	if (priv->ilb_base_addr)
+		iounmap(priv->ilb_base_addr);
 }
 EXPORT_SYMBOL_GPL(tpm_tis_remove);
 
@@ -921,22 +924,15 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq,
 		}
 	}
 
-	rc = tpm_chip_register(chip);
-	if (rc && is_bsw())
-		iounmap(priv->ilb_base_addr);
-
 	if (chip->ops->clk_enable != NULL)
 		chip->ops->clk_enable(chip, false);
 
-	return rc;
+	rc = tpm_chip_register(chip);
+	if (rc):
+		goto out_err;
+	return 0;
 out_err:
 	tpm_tis_remove(chip);
-	if (is_bsw())
-		iounmap(priv->ilb_base_addr);
-
-	if (chip->ops->clk_enable != NULL)
-		chip->ops->clk_enable(chip, false);
-
 	return rc;
 }
 EXPORT_SYMBOL_GPL(tpm_tis_core_init);

  parent reply	other threads:[~2017-12-20 18:09 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-20 11:35 [PATCH 0/4] tpm: fix PS/2 devices not working on Braswell systems due CLKRUN enabled Javier Martinez Canillas
2017-12-20 11:35 ` [PATCH 1/4] tpm: fix access attempt to an already unmapped I/O memory region Javier Martinez Canillas
2017-12-20 15:25   ` Shaikh, Azhar
2017-12-20 18:08   ` Jason Gunthorpe [this message]
2017-12-20 18:21     ` Javier Martinez Canillas
2017-12-20 18:54       ` Jason Gunthorpe
2017-12-20 19:15         ` Shaikh, Azhar
2017-12-21 12:48           ` Javier Martinez Canillas
2017-12-21 15:39             ` Shaikh, Azhar
2017-12-21 15:53               ` Javier Martinez Canillas
2017-12-21 16:34                 ` Shaikh, Azhar
2017-12-22 18:35   ` Jarkko Sakkinen
2017-12-24 20:57   ` Jarkko Sakkinen
2017-12-20 11:35 ` [PATCH 2/4] tpm: delete the TPM_TIS_CLK_ENABLE flag Javier Martinez Canillas
2017-12-20 15:19   ` Shaikh, Azhar
2017-12-20 18:10     ` Jason Gunthorpe
2017-12-20 18:26       ` Javier Martinez Canillas
2017-12-22 18:38         ` Jarkko Sakkinen
2017-12-22 18:33   ` Jarkko Sakkinen
2017-12-20 11:35 ` [PATCH 3/4] tpm: follow coding style for variable declaration in tpm_tis_core_init() Javier Martinez Canillas
2017-12-22 18:32   ` Jarkko Sakkinen
2017-12-20 11:35 ` [PATCH 4/4] tpm: only attempt to disable the LPC CLKRUN if is already enabled Javier Martinez Canillas
2017-12-22 18:36   ` Jarkko Sakkinen
2017-12-20 11:43 ` [PATCH 0/4] tpm: fix PS/2 devices not working on Braswell systems due CLKRUN enabled Hans de Goede
2017-12-20 12:12   ` Javier Martinez Canillas
2017-12-20 14:07     ` Alexander.Steffen
2017-12-20 14:35       ` Javier Martinez Canillas
2017-12-20 15:08       ` Shaikh, Azhar
2017-12-20 15:31         ` Javier Martinez Canillas
2017-12-20 15:41           ` Shaikh, Azhar
2017-12-20 16:45             ` Javier Martinez Canillas
2017-12-20 17:44               ` Jason Gunthorpe
2017-12-20 18:33                 ` Javier Martinez Canillas
2017-12-22 18:39   ` Jarkko Sakkinen
2017-12-21 10:51 ` James Ettle
2017-12-21 12:46   ` Javier Martinez Canillas
2017-12-21 17:25     ` Jeffery Miller
2017-12-21 18:44       ` Javier Martinez Canillas
2017-12-21 19:02         ` Jeffery Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20171220180855.GB22908@ziepe.ca \
    --to=jgg@ziepe.ca \
    --cc=arnd@arndb.de \
    --cc=azhar.shaikh@intel.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=hdegoede@redhat.com \
    --cc=james@ettle.org.uk \
    --cc=jarkko.sakkinen@linux.intel.com \
    --cc=javierm@redhat.com \
    --cc=linux-integrity@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=peterhuewe@gmx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.