From b96afce222dc8bc44d1f56dee2b314f1cfe09259 Mon Sep 17 00:00:00 2001 From: Jim Chen Date: Tue, 9 Jan 2018 22:36:46 -0500 Subject: [PATCH] GUACAMOLE-564: Hide APC escape sequence. An APC escape sequence contains an arbitrary string command between (ESC _) and (ESC \) sequences. While we don't support any APC commands, we should ignore any commands that we do encounter. --- src/terminal/terminal/terminal_handlers.h | 11 +++++++++++ src/terminal/terminal_handlers.c | 20 ++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/terminal/terminal/terminal_handlers.h b/src/terminal/terminal/terminal_handlers.h index 0b2f9bb3..6130d2cf 100644 --- a/src/terminal/terminal/terminal_handlers.h +++ b/src/terminal/terminal/terminal_handlers.h @@ -186,5 +186,16 @@ int guac_terminal_osc(guac_terminal* term, unsigned char c); */ int guac_terminal_ctrl_func(guac_terminal* term, unsigned char c); +/** + * Handles terminal control function sequences initiated with "ESC _". + * + * @param term + * The terminal that received the given character of data. + * + * @param c + * The character that was received by the given terminal. + */ +int guac_terminal_apc(guac_terminal* term, unsigned char c); + #endif diff --git a/src/terminal/terminal_handlers.c b/src/terminal/terminal_handlers.c index 02e9f9df..afbf20e6 100644 --- a/src/terminal/terminal_handlers.c +++ b/src/terminal/terminal_handlers.c @@ -367,6 +367,10 @@ int guac_terminal_escape(guac_terminal* term, unsigned char c) { guac_terminal_reset(term); break; + case '_': + term->char_handler = guac_terminal_apc; + break; + default: guac_client_log(term->client, GUAC_LOG_DEBUG, "Unhandled ESC sequence: %c", c); @@ -1373,3 +1377,19 @@ int guac_terminal_ctrl_func(guac_terminal* term, unsigned char c) { } +int guac_terminal_apc(guac_terminal* term, unsigned char c) { + + /* xterm does not implement APC functions and neither do we. Look for the + * "ESC \" (string terminator) sequence, while ignoring other chars. */ + static bool escaping = false; + + if (escaping) { + if (c == '\\') + term->char_handler = guac_terminal_echo; + escaping = false; + } + + if (c == 0x1B) + escaping = true; + return 0; +}