USB: cdc-acm: Fix disconnect() vs close() race
authorHavard Skinnemoen <hskinnemoen@google.com>
Wed, 9 Nov 2011 21:47:38 +0000 (13:47 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Sat, 26 Nov 2011 17:08:38 +0000 (09:08 -0800)
commit195f0cd98344bfa50c995add0397efe1d60501f6
treed4876236a03ebd80f9dd1c4d72e296f94756b657
parentc5d412bfb9fe3dbd61d5ce2257b2ab5ed10ee44a
USB: cdc-acm: Fix disconnect() vs close() race

commit 5dc2470c602da8851907ec18942cd876c3b4ecc1 upstream.

There's a race between the USB disconnect handler and the TTY close
handler which may cause the acm object to be freed while it's still
being used. This may lead to things like

http://article.gmane.org/gmane.linux.usb.general/54250

and

https://lkml.org/lkml/2011/5/29/64

This is the simplest fix I could come up with. Holding on to open_mutex
while closing the TTY device prevents acm_disconnect() from freeing the
acm object between acm->port.count drops to 0 and the TTY side of the
cleanups are finalized.

Signed-off-by: Havard Skinnemoen <hskinnemoen@google.com>
Cc: Oliver Neukum <oliver@neukum.name>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/class/cdc-acm.c