Patch "tty: fix data race between tty_init_dev and flush of buf" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
tty: fix data race between tty_init_dev and flush of buf
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
tty-fix-data-race-between-tty_init_dev-and-flush-of-buf.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
b027e2298bd588d6fa36ed2eda97447fb3eac078Mon Sep 17 00:00:00 2001
From: Gaurav Kohli <[email protected]>
Date: Tue, 23 Jan 2018 13:16:34 +0530
Subject: tty: fix data race between tty_init_dev and flush of buf
From: Gaurav Kohli <[email protected]>
commit b027e2298bd588d6fa36ed2eda97447fb3eac078 upstream.
There can be a race, if receive_buf call comes before tty initialization completes in n_tty_open and tty->disc_data may be NULL.
CPU0 CPU1
---- ----
000|n_tty_receive_buf_common() n_tty_open() -001|n_tty_receive_buf2() tty_ldisc_open.isra.3() -002|tty_ldisc_receive_buf(inline) tty_ldisc_setup()
Using ldisc semaphore lock in tty_init_dev till disc_data initializes completely.
--- drivers/tty/tty_io.c | 8 +++++++- drivers/tty/tty_ldisc.c | 4 ++-- include/linux/tty.h | 2 ++ 3 files changed, 11 insertions(+), 3 deletions(-)
drivers/tty/tty_io.c +7 -1
@@ -1543,6 +1543,9 @@ struct tty_struct *tty_init_dev(struct t"%s: %s driver does not set tty->port. This will crash the kernel later. Fix the driver!\n" , __func__, tty->driver->name); + retval =tty_ldisc_lock (tty,5 *HZ ); +if (retval) + goto err_release_lock; tty->port->itty = tty;/*
@@ -1553,6 +1556,7 @@ struct tty_struct *tty_init_dev(struct t retval =tty_ldisc_setup (tty, tty->link);if (retval) goto err_release_tty; +tty_ldisc_unlock (tty);/* Return the tty locked so that it cannot vanish under the caller */ return tty;
@@ -1565,9 +1569,11 @@ err_module_put:/* call the tty release_tty routine to clean out this slot */ err_release_tty: -tty_unlock (tty); +tty_ldisc_unlock (tty);tty_info_ratelimited (tty,"ldisc open failed (%d), clearing slot %d\n" , retval, idx); +err_release_lock: +tty_unlock (tty);release_tty (tty, idx);return ERR_PTR (retval); }
drivers/tty/tty_ldisc.c +2 -2
@@ -336,7 +336,7 @@ static inline void __tty_ldisc_unlock(stldsem_up_write (&tty->ldisc_sem); } -static int tty_ldisc_lock (struct tty_struct *tty,unsigned long timeout) +int tty_ldisc_lock (struct tty_struct *tty,unsigned long timeout) {int ret;
@@ -347,7 +347,7 @@ static int tty_ldisc_lock(struct tty_strreturn 0 ; } -static void tty_ldisc_unlock (struct tty_struct *tty) +void tty_ldisc_unlock (struct tty_struct *tty) {clear_bit (TTY_LDISC_HALTED , &tty->flags);__tty_ldisc_unlock (tty);
include/linux/tty.h +2 -0
@@ -394,6 +394,8 @@ extern struct tty_struct *get_current_tt/* tty_io.c */ extern int __init tty_init (void );extern const char *tty_name (const struct tty_struct *tty); +extern int tty_ldisc_lock (struct tty_struct *tty,unsigned long timeout); +extern void tty_ldisc_unlock (struct tty_struct *tty);#else static inline void console_init (void ) { }
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/tty-fix-data-race-between-tty_init_dev-and-flush-of-buf.patch