Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c274f6ef authored by Peter Hurley's avatar Peter Hurley Committed by Greg Kroah-Hartman
Browse files

tty: Hold termios_rwsem for tcflow(TCIxxx)



While transmitting a START/STOP char for tcflow(TCION/TCIOFF), prevent
a termios change. Otherwise, a garbage in-band flow control char
may be sent, if the termios change overlaps the transmission setup.

Signed-off-by: default avatarPeter Hurley <peter@hurleysoftware.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 136d5258
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -1164,17 +1164,21 @@ int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file,
			spin_unlock_irq(&tty->flow_lock);
			break;
		case TCIOFF:
			down_read(&tty->termios_rwsem);
			if (STOP_CHAR(tty) != __DISABLED_CHAR)
				return tty_send_xchar(tty, STOP_CHAR(tty));
				retval = tty_send_xchar(tty, STOP_CHAR(tty));
			up_read(&tty->termios_rwsem);
			break;
		case TCION:
			down_read(&tty->termios_rwsem);
			if (START_CHAR(tty) != __DISABLED_CHAR)
				return tty_send_xchar(tty, START_CHAR(tty));
				retval = tty_send_xchar(tty, START_CHAR(tty));
			up_read(&tty->termios_rwsem);
			break;
		default:
			return -EINVAL;
		}
		return 0;
		return retval;
	case TCFLSH:
		retval = tty_check_change(tty);
		if (retval)