Commit 66528f90 authored by Peter Hurley's avatar Peter Hurley Committed by Greg Kroah-Hartman

tty: Correct INPCK handling

If INPCK is not set, input parity detection should be disabled. This means
parity errors should not be received from the tty driver, and the data
received should be treated normally.

SUS v3, 11.2.2, General Terminal Interface - Input Modes, states:
  "If INPCK is set, input parity checking shall be enabled. If INPCK is
   not set, input parity checking shall be disabled, allowing output parity
   generation without input parity errors. Note that whether input parity
   checking is enabled or disabled is independent of whether parity detection
   is enabled or disabled (see Control Modes). If parity detection is enabled
   but input parity checking is disabled, the hardware to which the terminal
   is connected shall recognize the parity bit, but the terminal special file
   shall not check whether or not this bit is correctly set."

Ignore parity errors reported by the tty driver when INPCK is not set, and
handle the received data normally.

Fixes: Bugzilla #71681, 'Improvement of n_tty_receive_parity_error from n_tty.c'
Reported-by: default avatarIvan <athlon_@mail.ru>
Signed-off-by: default avatarPeter Hurley <peter@hurleysoftware.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ef8b9ddc
...@@ -1214,15 +1214,16 @@ static void n_tty_receive_parity_error(struct tty_struct *tty, unsigned char c) ...@@ -1214,15 +1214,16 @@ static void n_tty_receive_parity_error(struct tty_struct *tty, unsigned char c)
{ {
struct n_tty_data *ldata = tty->disc_data; struct n_tty_data *ldata = tty->disc_data;
if (I_IGNPAR(tty)) if (I_INPCK(tty)) {
return; if (I_IGNPAR(tty))
if (I_PARMRK(tty)) { return;
put_tty_queue('\377', ldata); if (I_PARMRK(tty)) {
put_tty_queue('\0', ldata); put_tty_queue('\377', ldata);
put_tty_queue(c, ldata); put_tty_queue('\0', ldata);
} else if (I_INPCK(tty)) put_tty_queue(c, ldata);
put_tty_queue('\0', ldata); } else
else put_tty_queue('\0', ldata);
} else
put_tty_queue(c, ldata); put_tty_queue(c, ldata);
if (waitqueue_active(&tty->read_wait)) if (waitqueue_active(&tty->read_wait))
wake_up_interruptible(&tty->read_wait); wake_up_interruptible(&tty->read_wait);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment