Input: serio - take drv_mutex in serio_cleanup()
authorDmitry Torokhov <dtor@insightbb.com>
Fri, 29 Jun 2007 05:06:35 +0000 (01:06 -0400)
committerDmitry Torokhov <dtor@insightbb.com>
Fri, 29 Jun 2007 05:06:35 +0000 (01:06 -0400)
We need to take serio->drv_mutex in serio_cleanup() to prevent the
function from being called while driver is in the middle of attaching
to a serio port. Such situation can happen with i8042 and atkbd drivers
if user rapidly presses Ctrl-Alt-Del during system startup, and leads
to kernel oops.

Reported-by: Dave Young <hidave.darkstar@gmail.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
drivers/input/serio/serio.c

index 5895202b972c01ef1f85cda6a42585759fef65d9..a8f3bc1dff221ed00e0e2e513b0978a32f4a2779 100644 (file)
@@ -769,8 +769,10 @@ static int serio_driver_remove(struct device *dev)
 
 static void serio_cleanup(struct serio *serio)
 {
+       mutex_lock(&serio->drv_mutex);
        if (serio->drv && serio->drv->cleanup)
                serio->drv->cleanup(serio);
+       mutex_unlock(&serio->drv_mutex);
 }
 
 static void serio_shutdown(struct device *dev)