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:
Родитель
ee5aa7b8b9
Коммит
62b263585b
|
@ -576,33 +576,23 @@ static void process_echoes(struct tty_struct *tty)
|
|||
break;
|
||||
|
||||
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
|
||||
* undefined op.
|
||||
* If the op is not a special byte code,
|
||||
* 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;
|
||||
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
|
||||
* L_ECHO(tty) is true. Called from the driver receive_buf path.
|
||||
*
|
||||
* This variant tags control characters to be possibly echoed as
|
||||
* as "^X" (where X is the letter representing the control char).
|
||||
* This variant tags control characters to be echoed as "^X"
|
||||
* (where X is the letter representing the control char).
|
||||
*
|
||||
* 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);
|
||||
} else {
|
||||
if (iscntrl(c) && c != '\t')
|
||||
if (L_ECHOCTL(tty) && iscntrl(c) && c != '\t')
|
||||
add_echo_byte(ECHO_OP_START, tty);
|
||||
add_echo_byte(c, tty);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче