All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
To: Jann Horn <jann@thejh.net>, Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: linux-kernel@vger.kernel.org, linux-parport@lists.infradead.org,
	Andy Lutomirski <luto@amacapital.net>
Subject: Re: [PATCH] ppdev: fix double-free of pp->pdev->name
Date: Sun, 30 Oct 2016 23:24:27 +0530	[thread overview]
Message-ID: <581633D3.3080502@gmail.com> (raw)
In-Reply-To: <1477842248-2234-1-git-send-email-jann@thejh.net>

On Sunday 30 October 2016 09:14 PM, Jann Horn wrote:
> free_pardevice() is called by parport_unregister_device() and already frees
> pp->pdev->name, don't try to do it again.
>
> This bug causes kernel crashes.
>
> I found and verified this with KASAN and some added pr_emerg()s:
>
> [   60.316568] pp_release: pp->pdev->name == ffff88039cb264c0
> [   60.316692] free_pardevice: freeing par_dev->name at ffff88039cb264c0
> [   60.316706] pp_release: kfree(ffff88039cb264c0)
> [   60.316714] ==========================================================
> [   60.316722] BUG: Double free or freeing an invalid pointer
> [   60.316731] Unexpected shadow byte: 0xFB
> [   60.316801] Object at ffff88039cb264c0, in cache kmalloc-32 size: 32
> [   60.316813] Allocated:
> [   60.316824] PID = 1695
> [   60.316869] Freed:
> [   60.316880] PID = 1695
> [   60.316935] ==========================================================
>
> CCing Andy Lutomirski because I think this is what broke vmapped stacks
> for me - after applying this patch, vmapped stacks worked for me.
> Previously, I got oopses (and lockups) caused by area->pages[0] being
> 0x400000000 in __vunmap(), with area->pages being allocated in the kmalloc
> area.

I think the above should not be a part of the commit message.
It looks like a valid bug. As we have now started using the device model 
from this release, so device_unregister() will finally call 
free_pardevice() and that will free the name.

>
> Signed-off-by: Jann Horn <jann@thejh.net>
> ---

Acked-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com>

>   drivers/char/ppdev.c | 3 ---
>   1 file changed, 3 deletions(-)
>
> diff --git a/drivers/char/ppdev.c b/drivers/char/ppdev.c
> index d23368874710..6af1ce04b3da 100644
> --- a/drivers/char/ppdev.c
> +++ b/drivers/char/ppdev.c
> @@ -748,10 +748,7 @@ static int pp_release(struct inode *inode, struct file *file)
>   	}
>
>   	if (pp->pdev) {
> -		const char *name = pp->pdev->name;
> -
>   		parport_unregister_device(pp->pdev);
> -		kfree(name);
>   		pp->pdev = NULL;
>   		pr_debug(CHRDEV "%x: unregistered pardevice\n", minor);
>   	}
>

  parent reply	other threads:[~2016-10-30 17:54 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-30 15:44 [PATCH] ppdev: fix double-free of pp->pdev->name Jann Horn
2016-10-30 16:29 ` Andy Lutomirski
2016-10-30 16:47   ` Jann Horn
2016-10-30 17:54 ` Sudip Mukherjee [this message]
2016-10-30 18:00   ` Jann Horn
2016-10-30 22:12     ` Greg Kroah-Hartman

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=581633D3.3080502@gmail.com \
    --to=sudipm.mukherjee@gmail.com \
    --cc=arnd@arndb.de \
    --cc=gregkh@linuxfoundation.org \
    --cc=jann@thejh.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-parport@lists.infradead.org \
    --cc=luto@amacapital.net \
    /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.