Char: lp, protect LPGETSTATUS with port_mutex
authorsalina@us.ibm.com <salina@us.ibm.com>
Tue, 7 May 2013 14:18:09 +0000 (16:18 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 17 May 2013 01:08:58 +0000 (18:08 -0700)
commit221ba151731133c8b0e1cdb9bfd2a45b3ba8764b
treeba6f1ff35fdc25a3e3a27ba8dc8aceabc8b7e11d
parenta7b594b4905828b3bfc36be39d48b5e07a23c8e1
Char: lp, protect LPGETSTATUS with port_mutex

The patch fixes a problem in the lp driver that can cause oopses as
follows:
process A: calls lp_write, which in turn calls
parport_ieee1284_write_compat, and that invokes
parport_wait_peripheral
process B: meanwhile does an ioctl(LPGETSTATUS), which call
lp_release_parport when done. This function will set
physport->cad = NULL.
process A: parport_wait_peripheral tries to dereference
physport->cad and dies

So, protect that code with the port_mutex in order to protect against
simultaneous calls to lp_read/lp_write.

Similar protection is probably required for ioctl(LPRESET)...

This patch was done by IBM a while back and we (at suse) have that
since at least 2004 in our repos. Let's make it upstream.

Signed-off-by: okir@suse.de
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/char/lp.c