]> git.baikalelectronics.ru Git - kernel.git/commit
can, slip: Protect tty->disc_data in write_wakeup and close with RCU
authorRichard Palethorpe <rpalethorpe@suse.com>
Tue, 21 Jan 2020 13:42:58 +0000 (14:42 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 22 Jan 2020 19:32:03 +0000 (20:32 +0100)
commit0e4bd923d7c9d1a277bea627828b20ee8edca974
treeed49a8e810ee581690f34039e71815510b693e98
parentcd3b979330d9c7c76a62da297e08743b3cd9e0ee
can, slip: Protect tty->disc_data in write_wakeup and close with RCU

write_wakeup can happen in parallel with close/hangup where tty->disc_data
is set to NULL and the netdevice is freed thus also freeing
disc_data. write_wakeup accesses disc_data so we must prevent close from
freeing the netdev while write_wakeup has a non-NULL view of
tty->disc_data.

We also need to make sure that accesses to disc_data are atomic. Which can
all be done with RCU.

This problem was found by Syzkaller on SLCAN, but the same issue is
reproducible with the SLIP line discipline using an LTP test based on the
Syzkaller reproducer.

A fix which didn't use RCU was posted by Hillf Danton.

Fixes: 2d2c15e49c75 ("slip: Fix deadlock in write_wakeup")
Fixes: 14dea43b5953 ("slcan: Port write_wakeup deadlock fix from slip")
Reported-by: syzbot+017e491ae13c0068598a@syzkaller.appspotmail.com
Signed-off-by: Richard Palethorpe <rpalethorpe@suse.com>
Cc: Wolfgang Grandegger <wg@grandegger.com>
Cc: Marc Kleine-Budde <mkl@pengutronix.de>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Tyler Hall <tylerwhall@gmail.com>
Cc: linux-can@vger.kernel.org
Cc: netdev@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Cc: syzkaller@googlegroups.com
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/can/slcan.c
drivers/net/slip/slip.c