vt: detect and ignore OSC codes.
These can be used to send commands consisting of an arbitrary string to the terminal, most often used to set a terminal's window title or to redefine the colour palette. Our console doesn't use OSC, unlike everything else, which can lead to junk being displayed if a process sends such a code unconditionally. The rules for termination follow established practice rather than Ecma-48. Ecma-48 requires the string to use only byte values 0x08..0x0D and 0x20..0x7E, terminated with either ESC \ or 0x9C. This would disallow using 8-bit characters, which are reasonable for example in window titles. A widespread idiom is to terminate with 0x07. The behaviour for other control characters differs between terminal emulators, I followed libvte and xterm: * 0x07 and ESC anything terminate * nothing else terminates, all 8-bit values including 0x9C are considered a part of the string Signed-off-by: Adam Borowski <kilobyte@angband.pl> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
b290af68de
commit
63f3a16db9
|
@ -1592,7 +1592,7 @@ static void restore_cur(struct vc_data *vc)
|
|||
|
||||
enum { ESnormal, ESesc, ESsquare, ESgetpars, ESfunckey,
|
||||
EShash, ESsetG0, ESsetG1, ESpercent, ESignore, ESnonstd,
|
||||
ESpalette };
|
||||
ESpalette, ESosc };
|
||||
|
||||
/* console_lock is held (except via vc_init()) */
|
||||
static void reset_terminal(struct vc_data *vc, int do_clear)
|
||||
|
@ -1652,11 +1652,15 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c)
|
|||
* Control characters can be used in the _middle_
|
||||
* of an escape sequence.
|
||||
*/
|
||||
if (vc->vc_state == ESosc && c>=8 && c<=13) /* ... except for OSC */
|
||||
return;
|
||||
switch (c) {
|
||||
case 0:
|
||||
return;
|
||||
case 7:
|
||||
if (vc->vc_bell_duration)
|
||||
if (vc->vc_state == ESosc)
|
||||
vc->vc_state = ESnormal;
|
||||
else if (vc->vc_bell_duration)
|
||||
kd_mksound(vc->vc_bell_pitch, vc->vc_bell_duration);
|
||||
return;
|
||||
case 8:
|
||||
|
@ -1767,7 +1771,9 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c)
|
|||
} else if (c=='R') { /* reset palette */
|
||||
reset_palette(vc);
|
||||
vc->vc_state = ESnormal;
|
||||
} else
|
||||
} else if (c>='0' && c<='9')
|
||||
vc->vc_state = ESosc;
|
||||
else
|
||||
vc->vc_state = ESnormal;
|
||||
return;
|
||||
case ESpalette:
|
||||
|
@ -2021,6 +2027,8 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c)
|
|||
vc->vc_translate = set_translate(vc->vc_G1_charset, vc);
|
||||
vc->vc_state = ESnormal;
|
||||
return;
|
||||
case ESosc:
|
||||
return;
|
||||
default:
|
||||
vc->vc_state = ESnormal;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue