mirror of
https://github.com/Divested-Mobile/DivestOS-Build.git
synced 2024-12-21 05:44:30 -05:00
81 lines
3.3 KiB
Diff
81 lines
3.3 KiB
Diff
|
From 1a0220ebac77da3d9e2989528e64e1683c63fb58 Mon Sep 17 00:00:00 2001
|
||
|
From: Peter Hurley <peter@hurleysoftware.com>
|
||
|
Date: Fri, 27 Nov 2015 14:30:21 -0500
|
||
|
Subject: [PATCH] BACKPORT: tty: Prevent ldisc drivers from re-using stale tty
|
||
|
fields
|
||
|
|
||
|
(cherry picked from commit dd42bf1197144ede075a9d4793123f7689e164bc)
|
||
|
|
||
|
Line discipline drivers may mistakenly misuse ldisc-related fields
|
||
|
when initializing. For example, a failure to initialize tty->receive_room
|
||
|
in the N_GIGASET_M101 line discipline was recently found and fixed [1].
|
||
|
Now, the N_X25 line discipline has been discovered accessing the previous
|
||
|
line discipline's already-freed private data [2].
|
||
|
|
||
|
Harden the ldisc interface against misuse by initializing revelant
|
||
|
tty fields before instancing the new line discipline.
|
||
|
|
||
|
[1]
|
||
|
commit fd98e9419d8d622a4de91f76b306af6aa627aa9c
|
||
|
Author: Tilman Schmidt <tilman@imap.cc>
|
||
|
Date: Tue Jul 14 00:37:13 2015 +0200
|
||
|
|
||
|
isdn/gigaset: reset tty->receive_room when attaching ser_gigaset
|
||
|
|
||
|
[2] Report from Sasha Levin <sasha.levin@oracle.com>
|
||
|
[ 634.336761] ==================================================================
|
||
|
[ 634.338226] BUG: KASAN: use-after-free in x25_asy_open_tty+0x13d/0x490 at addr ffff8800a743efd0
|
||
|
[ 634.339558] Read of size 4 by task syzkaller_execu/8981
|
||
|
[ 634.340359] =============================================================================
|
||
|
[ 634.341598] BUG kmalloc-512 (Not tainted): kasan: bad access detected
|
||
|
...
|
||
|
[ 634.405018] Call Trace:
|
||
|
[ 634.405277] dump_stack (lib/dump_stack.c:52)
|
||
|
[ 634.405775] print_trailer (mm/slub.c:655)
|
||
|
[ 634.406361] object_err (mm/slub.c:662)
|
||
|
[ 634.406824] kasan_report_error (mm/kasan/report.c:138 mm/kasan/report.c:236)
|
||
|
[ 634.409581] __asan_report_load4_noabort (mm/kasan/report.c:279)
|
||
|
[ 634.411355] x25_asy_open_tty (drivers/net/wan/x25_asy.c:559 (discriminator 1))
|
||
|
[ 634.413997] tty_ldisc_open.isra.2 (drivers/tty/tty_ldisc.c:447)
|
||
|
[ 634.414549] tty_set_ldisc (drivers/tty/tty_ldisc.c:567)
|
||
|
[ 634.415057] tty_ioctl (drivers/tty/tty_io.c:2646 drivers/tty/tty_io.c:2879)
|
||
|
[ 634.423524] do_vfs_ioctl (fs/ioctl.c:43 fs/ioctl.c:607)
|
||
|
[ 634.427491] SyS_ioctl (fs/ioctl.c:622 fs/ioctl.c:613)
|
||
|
[ 634.427945] entry_SYSCALL_64_fastpath (arch/x86/entry/entry_64.S:188)
|
||
|
|
||
|
Cc: Tilman Schmidt <tilman@imap.cc>
|
||
|
Cc: Sasha Levin <sasha.levin@oracle.com>
|
||
|
Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
|
||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||
|
Change-Id: Ibed6feadfb9706d478f93feec3b240aecfc64af3
|
||
|
Bug: 30951112
|
||
|
---
|
||
|
drivers/tty/tty_ldisc.c | 7 +++++++
|
||
|
1 file changed, 7 insertions(+)
|
||
|
|
||
|
diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c
|
||
|
index b7b8048f12539..420dd6e52a279 100644
|
||
|
--- a/drivers/tty/tty_ldisc.c
|
||
|
+++ b/drivers/tty/tty_ldisc.c
|
||
|
@@ -415,6 +415,10 @@ EXPORT_SYMBOL_GPL(tty_ldisc_flush);
|
||
|
* they are not on hot paths so a little discipline won't do
|
||
|
* any harm.
|
||
|
*
|
||
|
+ * The line discipline-related tty_struct fields are reset to
|
||
|
+ * prevent the ldisc driver from re-using stale information for
|
||
|
+ * the new ldisc instance.
|
||
|
+ *
|
||
|
* Locking: takes termios_mutex
|
||
|
*/
|
||
|
|
||
|
@@ -423,6 +427,9 @@ static void tty_set_termios_ldisc(struct tty_struct *tty, int num)
|
||
|
mutex_lock(&tty->termios_mutex);
|
||
|
tty->termios.c_line = num;
|
||
|
mutex_unlock(&tty->termios_mutex);
|
||
|
+
|
||
|
+ tty->disc_data = NULL;
|
||
|
+ tty->receive_room = 0;
|
||
|
}
|
||
|
|
||
|
/**
|