[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <1477842248-2234-1-git-send-email-jann@thejh.net>
Date: Sun, 30 Oct 2016 16:44:08 +0100
From: Jann Horn <jann@...jh.net>
To: Arnd Bergmann <arnd@...db.de>,
Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
Sudip Mukherjee <sudipm.mukherjee@...il.com>
Cc: linux-kernel@...r.kernel.org, linux-parport@...ts.infradead.org,
Andy Lutomirski <luto@...capital.net>
Subject: [PATCH] ppdev: fix double-free of pp->pdev->name
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.
Signed-off-by: Jann Horn <jann@...jh.net>
---
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);
}
--
2.1.4
Powered by blists - more mailing lists