Re: [PATCH] ppdev: fix double-free of pp->pdev->name

Jann Horn <[email protected]>
Newsgroups gmane.linux.kernel,gmane.linux.parport
Message-ID <[email protected]>
On Sun, Oct 30, 2016 at 09:29:10AM -0700, Andy Lutomirski wrote:
> On Sun, Oct 30, 2016 at 8:44 AM, Jann Horn <[email protected]> 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?
signature.asc (application/pgp-signature, 819 B)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQIcBAEBAgAGBQJYFiQnAAoJED4KNFJOeCOowpYQAIwZovNzwJ4kKUq0tYcWcLhz
Ksz5qqJIT0VWLqzXtOMOLaJi+CB2AYrHXf8W7aIww1DHN5fzVZJsOVDSSAmG1lI5
VOo2IyIKRQNiWv9fHgvBBwvn6w8YBRS2FYuphPtQjFPWwzdoDpngurnU8tpF5S6l
BgpsB8eVxBEdd+YbjPB8jrJPrzAKJPTf7u3XQyVR/eUkPZCCwGyhw4ritM0k8hHx
uyNPxCa9f1Jc7maSI2nwU6ljUHewR0HQ+8CKMNpCdB9gQBjwhBzxAxlF8zcnWqnF
l/oAzoIsMpaOCRw9QPV68F7SmbzZpFYb1K2SDGn/2Wjqjd1snTQytwEkmgJ3Zw7T
LsTI2BhK61rkDutipMVICK/GIemyjG80V3Q3MS3bo5rzjNcnY7z3hKhaqMK4Vpy5
yP2EHlyK+t55jsr7rbPAG8oPh4WhEpT4bxaf690DgN/x1w5CDdHUZFQIqNk7SD+v
KJipB9MAGkQdvWEoxMHHKZ/ZzUGbiAd/faIJGyCZDTxOYIdAJ0i98Tq4HFfr0Rw4
cgl8MWlGVe6g+MXybVcuuToS75VkgoG9vPYT+cbHQmCA9GRVmiiWE220xL6lvMRd
lLmRNAbNuaP6Vs31cOK5MASbnjJDR05nvjyq4Oo9xSYka8bwtpFqspgXAnJxuJ69
xd1JKdMMlYpEJVXdbo1b
=VS+d
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.