1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-09 17:38:00 +00:00

Recognise and discard the APC terminal escape sequence.

I encountered an instance of this sequence in the log files from a
clang CI build. The payload text inside the wrapper was
"bk;t=1697630539879"; I don't know what the "bk" stood for, but the
second half appears to be a timestamp in milliseconds since the Unix
epoch.

I don't think there's anything we can (or should) actually _do_ with
this sequence, but I think it's useful to at least recognise it, so
that it can be conveniently discarded.

(cherry picked from commit 7b10e34b8f)
This commit is contained in:
Simon Tatham 2023-10-19 18:55:04 +01:00
parent bb453dd27c
commit c6013e2969
2 changed files with 23 additions and 0 deletions

View File

@ -3206,6 +3206,13 @@ static void toggle_mode(Terminal *term, int mode, int query, bool state)
*/
static void do_osc(Terminal *term)
{
if (term->osc_is_apc) {
/* This OSC was really an APC, and we don't support that
* sequence at all. We only recognise it in order to ignore it
* and filter it out of input. */
return;
}
if (term->osc_w) {
while (term->osc_strlen--)
term->wordness[(unsigned char)term->osc_string[term->osc_strlen]] =
@ -4134,6 +4141,21 @@ static void term_out(Terminal *term, bool called_from_term_data)
/* Compatibility is nasty here, xterm, linux, decterm yuk! */
compatibility(OTHER);
term->termstate = SEEN_OSC;
term->osc_is_apc = false;
term->osc_strlen = 0;
term->esc_args[0] = 0;
term->esc_nargs = 1;
break;
case '_': /* APC: application program command */
/* APC sequences are just a string, terminated by
* ST or (I've observed in practice) ^G. That is,
* they have the same termination convention as
* OSC. So we handle them by going straight into
* OSC_STRING state and setting a flag indicating
* that it's not really an OSC. */
compatibility(OTHER);
term->termstate = SEEN_OSC;
term->osc_is_apc = true;
term->osc_strlen = 0;
term->esc_args[0] = 0;
term->esc_nargs = 1;

View File

@ -183,6 +183,7 @@ struct terminal_tag {
#define ANSI_QUE(x) ANSI(x,1)
#define OSC_STR_MAX 2048
bool osc_is_apc;
int osc_strlen;
char osc_string[OSC_STR_MAX + 1];
bool osc_w;