From: Jann Horn <jann@thejh.net>
To: Andy Lutomirski <luto@amacapital.net>
Cc: Arnd Bergmann <arnd@arndb.de>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Sudip Mukherjee <sudipm.mukherjee@gmail.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
linux-parport@lists.infradead.org
Subject: Re: [PATCH] ppdev: fix double-free of pp->pdev->name
Date: Sun, 30 Oct 2016 17:47:35 +0100 [thread overview]
Message-ID: <20161030164735.GA2558@pc.thejh.net> (raw)
In-Reply-To: <CALCETrXmvCuuH8YW=ttzOAMs0A10NKjDFPvDDm6hP7UhrXrUdg@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 2156 bytes --]
On Sun, Oct 30, 2016 at 09:29:10AM -0700, Andy Lutomirski wrote:
> On Sun, Oct 30, 2016 at 8:44 AM, Jann Horn <jann@thejh.net> 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.
>
> That's an odd symptom. I assume that what's happening is that the
> pages array is being freed early by the extra kfree in here and then
> getting corrupted.
Well, as far as I can tell, there are two ways to reach that.
Obvious first way, but a pretty tight race:
Task A: free(name)
Task B: allocate area->pages in same place
Task A: second free(name), releasing area->pages
Second way (if the SLAB allocator, which I'm using, is used):
Task A: free(name), appends the object to ac->entry in ___cache_free()
Task A: second free(name), appends the object to ac->entry again
Task B: ____cache_alloc() returns object from array cache
Task C: ____cache_alloc() returns same object again
So then the same memory would be used by two separate objects?
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
next prev parent reply other threads:[~2016-10-30 16:47 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 [this message]
2016-10-30 17:54 ` Sudip Mukherjee
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=20161030164735.GA2558@pc.thejh.net \
--to=jann@thejh.net \
--cc=arnd@arndb.de \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-parport@lists.infradead.org \
--cc=luto@amacapital.net \
--cc=sudipm.mukherjee@gmail.com \
/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.