n_tty: move echoctl check and clean up logic
Check L_ECHOCTL before insertting a character in the echo buffer (rather than as the buffer is processed), to be more consistent with when all other L_ flags are checked. Also cleaned up the related logic. Note that this and the previous patch ("n_tty: honor opost flag for echoes") were verified together by the reporters of the bug that patch addresses (http://bugs.linuxbase.org/show_bug.cgi?id=2692), and the test now passes. Signed-off-by: Joe Peterson <joe@skyrush.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
ee5aa7b8b9
commit
62b263585b
1 changed files with 18 additions and 28 deletions
|
@ -576,33 +576,23 @@ static void process_echoes(struct tty_struct *tty)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (iscntrl(op)) {
|
|
||||||
if (L_ECHOCTL(tty)) {
|
|
||||||
/*
|
|
||||||
* Ensure there is enough space
|
|
||||||
* for the whole ctrl pair.
|
|
||||||
*/
|
|
||||||
if (space < 2) {
|
|
||||||
no_space_left = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
tty_put_char(tty, '^');
|
|
||||||
tty_put_char(tty, op ^ 0100);
|
|
||||||
tty->column += 2;
|
|
||||||
space -= 2;
|
|
||||||
} else {
|
|
||||||
if (!space) {
|
|
||||||
no_space_left = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
tty_put_char(tty, op);
|
|
||||||
space--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*
|
/*
|
||||||
* If above falls through, this was an
|
* If the op is not a special byte code,
|
||||||
* undefined op.
|
* it is a ctrl char tagged to be echoed
|
||||||
|
* as "^X" (where X is the letter
|
||||||
|
* representing the control char).
|
||||||
|
* Note that we must ensure there is
|
||||||
|
* enough space for the whole ctrl pair.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
if (space < 2) {
|
||||||
|
no_space_left = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
tty_put_char(tty, '^');
|
||||||
|
tty_put_char(tty, op ^ 0100);
|
||||||
|
tty->column += 2;
|
||||||
|
space -= 2;
|
||||||
cp += 2;
|
cp += 2;
|
||||||
nr -= 2;
|
nr -= 2;
|
||||||
}
|
}
|
||||||
|
@ -809,8 +799,8 @@ static void echo_char_raw(unsigned char c, struct tty_struct *tty)
|
||||||
* Echo user input back onto the screen. This must be called only when
|
* Echo user input back onto the screen. This must be called only when
|
||||||
* L_ECHO(tty) is true. Called from the driver receive_buf path.
|
* L_ECHO(tty) is true. Called from the driver receive_buf path.
|
||||||
*
|
*
|
||||||
* This variant tags control characters to be possibly echoed as
|
* This variant tags control characters to be echoed as "^X"
|
||||||
* as "^X" (where X is the letter representing the control char).
|
* (where X is the letter representing the control char).
|
||||||
*
|
*
|
||||||
* Locking: echo_lock to protect the echo buffer
|
* Locking: echo_lock to protect the echo buffer
|
||||||
*/
|
*/
|
||||||
|
@ -823,7 +813,7 @@ static void echo_char(unsigned char c, struct tty_struct *tty)
|
||||||
add_echo_byte(ECHO_OP_START, tty);
|
add_echo_byte(ECHO_OP_START, tty);
|
||||||
add_echo_byte(ECHO_OP_START, tty);
|
add_echo_byte(ECHO_OP_START, tty);
|
||||||
} else {
|
} else {
|
||||||
if (iscntrl(c) && c != '\t')
|
if (L_ECHOCTL(tty) && iscntrl(c) && c != '\t')
|
||||||
add_echo_byte(ECHO_OP_START, tty);
|
add_echo_byte(ECHO_OP_START, tty);
|
||||||
add_echo_byte(c, tty);
|
add_echo_byte(c, tty);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue