mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-28 12:53:14 +01:00
slip: remove slip_hangup() to fix use-after-free in slip_receive_buf()
Jaeyoung Chung and Eulgyu Kim reported a slab-use-after-free read
in slip_receive_buf() when racing against tty hangup.
tty_ldisc_hangup() calls ld->ops->hangup() while holding only
a read lock on tty->ldisc_sem (via tty_ldisc_ref()).
Because slip_hangup() simply called slip_close(), it ran concurrently
with reader functions such as slip_receive_buf().
slip_close() unregisters and frees the net device and its private
struct slip, causing concurrent reader threads in slip_receive_buf()
to dereference freed memory.
Line discipline close() is already guaranteed to be called under
the write lock of tty->ldisc_sem during hangup processing
(in tty_ldisc_reinit() or tty_ldisc_kill()).
Remove slip_hangup() so teardown is serialized cleanly by slip_close().
Fixes: 5342b77c41 ("slip: Clean up create and destroy")
Reported-by: Jaeyoung Chung <[email protected]>
Reported-by: Eulgyu Kim <[email protected]>
Closes: https://lore.kernel.org/netdev/[email protected]/
Cc: Qingfang Deng <[email protected]>
Signed-off-by: Eric Dumazet <[email protected]>
Link: https://patch.msgid.link/[email protected]
Signed-off-by: Jakub Kicinski <[email protected]>
This commit is contained in:
1 parent
50e5c6605c
commit
23c53269f2
1 file changed
-8
@@ -886,8 +886,6 @@ err_exit:
|
||||
* Close down a SLIP channel.
|
||||
* This means flushing out any pending queues, and then returning. This
|
||||
* call is serialized against other ldisc functions.
|
||||
*
|
||||
* We also use this method fo a hangup event
|
||||
*/
|
||||
|
||||
static void slip_close(struct tty_struct *tty)
|
||||
@@ -915,11 +913,6 @@ static void slip_close(struct tty_struct *tty)
|
||||
unregister_netdev(sl->dev);
|
||||
/* sl_uninit() has dropped the slip_devs[] entry by now */
|
||||
}
|
||||
|
||||
static void slip_hangup(struct tty_struct *tty)
|
||||
{
|
||||
slip_close(tty);
|
||||
}
|
||||
/************************************************************************
|
||||
* STANDARD SLIP ENCAPSULATION *
|
||||
************************************************************************/
|
||||
@@ -1280,7 +1273,6 @@ static struct tty_ldisc_ops sl_ldisc = {
|
||||
.name = "slip",
|
||||
.open = slip_open,
|
||||
.close = slip_close,
|
||||
.hangup = slip_hangup,
|
||||
.ioctl = slip_ioctl,
|
||||
.receive_buf = slip_receive_buf,
|
||||
.write_wakeup = slip_write_wakeup,
|
||||
|
||||
Reference in new issue
Block a user