Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1329870 > unrolled thread

[PATCH] tpm: fix the cleanup of struct tpm_chip

Started byJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
First post2016-02-09 04:40 +0100
Last post2016-02-12 04:40 +0100
Articles 7 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH] tpm: fix the cleanup of struct tpm_chip Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> - 2016-02-09 04:40 +0100
    Re: [tpmdd-devel] [PATCH] tpm: fix the cleanup of struct tpm_chip Jason Gunthorpe <jgunthorpe@obsidianresearch.com> - 2016-02-09 06:30 +0100
      Re: [tpmdd-devel] [PATCH] tpm: fix the cleanup of struct tpm_chip Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> - 2016-02-09 07:30 +0100
        Re: [tpmdd-devel] [PATCH] tpm: fix the cleanup of struct tpm_chip Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> - 2016-02-09 07:30 +0100
          Re: [tpmdd-devel] [PATCH] tpm: fix the cleanup of struct tpm_chip Jason Gunthorpe <jgunthorpe@obsidianresearch.com> - 2016-02-09 18:10 +0100
    Re: [tpmdd-devel] [PATCH] tpm: fix the cleanup of struct tpm_chip Jason Gunthorpe <jgunthorpe@obsidianresearch.com> - 2016-02-11 20:40 +0100
      Re: [tpmdd-devel] [PATCH] tpm: fix the cleanup of struct tpm_chip Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> - 2016-02-12 04:40 +0100

#1329870 — [PATCH] tpm: fix the cleanup of struct tpm_chip

FromJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Date2016-02-09 04:40 +0100
Subject[PATCH] tpm: fix the cleanup of struct tpm_chip
Message-ID<r07jJ-6AS-25@gated-at.bofh.it>
If the initialization fails before tpm_chip_register(), put_device()
will be not called, which causes release callback not to be called.
This patch fixes the issue by adding put_device() to devres list of
the parent device.

Fixes: 313d21eeab ("tpm: device class for tpm")
Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
cc: stable@vger.kernel.org
---
 drivers/char/tpm/tpm-chip.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
index 1a9dcee..ea904d1 100644
--- a/drivers/char/tpm/tpm-chip.c
+++ b/drivers/char/tpm/tpm-chip.c
@@ -136,6 +136,8 @@ struct tpm_chip *tpmm_chip_alloc(struct device *dev,
 	chip->cdev.owner = chip->pdev->driver->owner;
 	chip->cdev.kobj.parent = &chip->dev.kobj;
 
+	devm_add_action(dev, (void (*)(void *)) put_device, &chip->dev);
+
 	return chip;
 }
 EXPORT_SYMBOL_GPL(tpmm_chip_alloc);
-- 
2.7.0

[toc] | [next] | [standalone]


#1329932 — Re: [tpmdd-devel] [PATCH] tpm: fix the cleanup of struct tpm_chip

FromJason Gunthorpe <jgunthorpe@obsidianresearch.com>
Date2016-02-09 06:30 +0100
SubjectRe: [tpmdd-devel] [PATCH] tpm: fix the cleanup of struct tpm_chip
Message-ID<r092a-81n-7@gated-at.bofh.it>
In reply to#1329870
On Tue, Feb 09, 2016 at 05:30:30AM +0200, Jarkko Sakkinen wrote:
> If the initialization fails before tpm_chip_register(), put_device()
> will be not called, which causes release callback not to be called.
> This patch fixes the issue by adding put_device() to devres list of
> the parent device.

Erm, if you do this, then shouldn't the device_unregister change to
device_del to keep the kref balanced?

Jason

[toc] | [prev] | [next] | [standalone]


#1329940 — Re: [tpmdd-devel] [PATCH] tpm: fix the cleanup of struct tpm_chip

FromJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Date2016-02-09 07:30 +0100
SubjectRe: [tpmdd-devel] [PATCH] tpm: fix the cleanup of struct tpm_chip
Message-ID<r09Ye-eN-1@gated-at.bofh.it>
In reply to#1329932
On Mon, Feb 08, 2016 at 10:26:55PM -0700, Jason Gunthorpe wrote:
> On Tue, Feb 09, 2016 at 05:30:30AM +0200, Jarkko Sakkinen wrote:
> > If the initialization fails before tpm_chip_register(), put_device()
> > will be not called, which causes release callback not to be called.
> > This patch fixes the issue by adding put_device() to devres list of
> > the parent device.
> 
> Erm, if you do this, then shouldn't the device_unregister change to
> device_del to keep the kref balanced?

Yes, it should. Weird, I added pr_info() (temporarily) to
tpm_dev_release() and did occur only once and no crashes whatsoever.

Anyway, you're right.

> Jason

/Jarkko

[toc] | [prev] | [next] | [standalone]


#1329942 — Re: [tpmdd-devel] [PATCH] tpm: fix the cleanup of struct tpm_chip

FromJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Date2016-02-09 07:30 +0100
SubjectRe: [tpmdd-devel] [PATCH] tpm: fix the cleanup of struct tpm_chip
Message-ID<r09Ye-eN-11@gated-at.bofh.it>
In reply to#1329940
On Tue, Feb 09, 2016 at 08:19:51AM +0200, Jarkko Sakkinen wrote:
> On Mon, Feb 08, 2016 at 10:26:55PM -0700, Jason Gunthorpe wrote:
> > On Tue, Feb 09, 2016 at 05:30:30AM +0200, Jarkko Sakkinen wrote:
> > > If the initialization fails before tpm_chip_register(), put_device()
> > > will be not called, which causes release callback not to be called.
> > > This patch fixes the issue by adding put_device() to devres list of
> > > the parent device.
> > 
> > Erm, if you do this, then shouldn't the device_unregister change to
> > device_del to keep the kref balanced?
> 
> Yes, it should. Weird, I added pr_info() (temporarily) to
> tpm_dev_release() and did occur only once and no crashes whatsoever.
> 
> Anyway, you're right.

Update:

https://github.com/jsakkine/linux-tpmdd/commit/a1aa547bbd2178628df798c27abaad073acb2441

I tested that the release gets called (as a sanity check).

Ack?

/Jarkko

[toc] | [prev] | [next] | [standalone]


#1330487 — Re: [tpmdd-devel] [PATCH] tpm: fix the cleanup of struct tpm_chip

FromJason Gunthorpe <jgunthorpe@obsidianresearch.com>
Date2016-02-09 18:10 +0100
SubjectRe: [tpmdd-devel] [PATCH] tpm: fix the cleanup of struct tpm_chip
Message-ID<r0jXB-76q-33@gated-at.bofh.it>
In reply to#1329942
On Tue, Feb 09, 2016 at 08:27:35AM +0200, Jarkko Sakkinen wrote:
> On Tue, Feb 09, 2016 at 08:19:51AM +0200, Jarkko Sakkinen wrote:
> > On Mon, Feb 08, 2016 at 10:26:55PM -0700, Jason Gunthorpe wrote:
> > > On Tue, Feb 09, 2016 at 05:30:30AM +0200, Jarkko Sakkinen wrote:
> > > > If the initialization fails before tpm_chip_register(), put_device()
> > > > will be not called, which causes release callback not to be called.
> > > > This patch fixes the issue by adding put_device() to devres list of
> > > > the parent device.
> > > 
> > > Erm, if you do this, then shouldn't the device_unregister change to
> > > device_del to keep the kref balanced?
> > 
> > Yes, it should. Weird, I added pr_info() (temporarily) to
> > tpm_dev_release() and did occur only once and no crashes whatsoever.

It is hard to make use after free show up in testing, testing does not
replace actually auditing these sorts of things.

> > Anyway, you're right.
> 
> Update:
> 
> https://github.com/jsakkine/linux-tpmdd/commit/a1aa547bbd2178628df798c27abaad073acb2441
> 
> I tested that the release gets called (as a sanity check).

Yeah,

Reviewed-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>

Jason

[toc] | [prev] | [next] | [standalone]


#1332333 — Re: [tpmdd-devel] [PATCH] tpm: fix the cleanup of struct tpm_chip

FromJason Gunthorpe <jgunthorpe@obsidianresearch.com>
Date2016-02-11 20:40 +0100
SubjectRe: [tpmdd-devel] [PATCH] tpm: fix the cleanup of struct tpm_chip
Message-ID<r15fQ-4NX-11@gated-at.bofh.it>
In reply to#1329870
On Tue, Feb 09, 2016 at 05:30:30AM +0200, Jarkko Sakkinen wrote:
> If the initialization fails before tpm_chip_register(), put_device()
> will be not called, which causes release callback not to be called.
> This patch fixes the issue by adding put_device() to devres list of
> the parent device.
> 
> Fixes: 313d21eeab ("tpm: device class for tpm")
> Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
> cc: stable@vger.kernel.org
>  drivers/char/tpm/tpm-chip.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
> index 1a9dcee..ea904d1 100644
> +++ b/drivers/char/tpm/tpm-chip.c
> @@ -136,6 +136,8 @@ struct tpm_chip *tpmm_chip_alloc(struct device *dev,
>  	chip->cdev.owner = chip->pdev->driver->owner;
>  	chip->cdev.kobj.parent = &chip->dev.kobj;
>  
> +	devm_add_action(dev, (void (*)(void *)) put_device, &chip->dev);
> +

Erm, don't forget the error handling here.

Something like this:

	rc = devm_add_action(dev, (void (*)(void *)) put_device, &chip->dev);
	if (rc) {
		put_device(&chip->dev);
		return ERR_PTR(rc);
	}

Jason

[toc] | [prev] | [next] | [standalone]


#1332506 — Re: [tpmdd-devel] [PATCH] tpm: fix the cleanup of struct tpm_chip

FromJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Date2016-02-12 04:40 +0100
SubjectRe: [tpmdd-devel] [PATCH] tpm: fix the cleanup of struct tpm_chip
Message-ID<r1cKm-1mG-1@gated-at.bofh.it>
In reply to#1332333
On Thu, Feb 11, 2016 at 12:34:15PM -0700, Jason Gunthorpe wrote:
> On Tue, Feb 09, 2016 at 05:30:30AM +0200, Jarkko Sakkinen wrote:
> > If the initialization fails before tpm_chip_register(), put_device()
> > will be not called, which causes release callback not to be called.
> > This patch fixes the issue by adding put_device() to devres list of
> > the parent device.
> > 
> > Fixes: 313d21eeab ("tpm: device class for tpm")
> > Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
> > cc: stable@vger.kernel.org
> >  drivers/char/tpm/tpm-chip.c | 2 ++
> >  1 file changed, 2 insertions(+)
> > 
> > diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
> > index 1a9dcee..ea904d1 100644
> > +++ b/drivers/char/tpm/tpm-chip.c
> > @@ -136,6 +136,8 @@ struct tpm_chip *tpmm_chip_alloc(struct device *dev,
> >  	chip->cdev.owner = chip->pdev->driver->owner;
> >  	chip->cdev.kobj.parent = &chip->dev.kobj;
> >  
> > +	devm_add_action(dev, (void (*)(void *)) put_device, &chip->dev);
> > +
> 
> Erm, don't forget the error handling here.
> 
> Something like this:
> 
> 	rc = devm_add_action(dev, (void (*)(void *)) put_device, &chip->dev);
> 	if (rc) {
> 		put_device(&chip->dev);
> 		return ERR_PTR(rc);
> 	}

I'll implement that as a separate commit since it is already in pull
request. Thanks.

/Jarkko

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web