Re: [PATCH 5.10.y and below 1/2] tty: Prevent writing chars during tcsetattr TCSADRAIN/FLUSH

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, May 11, 2023 at 03:32:43PM +0300, Ilpo Järvinen wrote:
> If userspace races tcsetattr() with a write, the drained condition
> might not be guaranteed by the kernel. There is a race window after
> checking Tx is empty before tty_set_termios() takes termios_rwsem for
> write. During that race window, more characters can be queued by a
> racing writer.
> 
> Any ongoing transmission might produce garbage during HW's
> ->set_termios() call. The intent of TCSADRAIN/FLUSH seems to be
> preventing such a character corruption. If those flags are set, take
> tty's write lock to stop any writer before performing the lower layer
> Tx empty check and wait for the pending characters to be sent (if any).
> 
> The initial wait for all-writers-done must be placed outside of tty's
> write lock to avoid deadlock which makes it impossible to use
> tty_wait_until_sent(). The write lock is retried if a racing write is
> detected.
> 
> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
> Cc: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@xxxxxxxxxxxxxxx>
> Link: https://lore.kernel.org/r/20230317113318.31327-2-ilpo.jarvinen@xxxxxxxxxxxxxxx
> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
> (cherry picked from commit 094fb49a2d0d6827c86d2e0840873e6db0c491d2)
> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@xxxxxxxxxxxxxxx>
> ---
>  drivers/tty/tty_io.c    |  4 ++--
>  drivers/tty/tty_ioctl.c | 45 ++++++++++++++++++++++++++++++-----------
>  include/linux/tty.h     |  2 ++
>  3 files changed, 37 insertions(+), 14 deletions(-)

Didn't apply to 4.14.y :(

But all others it did, so I've queued it up now there, thanks!

greg k-h



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux