Skip to content

Commit

Permalink
sideband: introduce an "escape hatch" to allow control characters
Browse files Browse the repository at this point in the history
The preceding commit fixed the vulnerability whereas sideband messages
(that are under the control of the remote server) could contain ANSI
escape sequences that would be sent to the terminal verbatim.

However, this fix may not be desirable under all circumstances, e.g.
when remote servers deliberately add coloring to their messages to
increase their urgency.

To help with those use cases, give users a way to opt-out of the
protections: `sideband.allowControlCharacters`.

Signed-off-by: Johannes Schindelin <[email protected]>
  • Loading branch information
dscho committed Jan 12, 2025
1 parent f7fb7a3 commit 14c612c
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 1 deletion.
2 changes: 2 additions & 0 deletions Documentation/config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -522,6 +522,8 @@ include::config/sequencer.txt[]

include::config/showbranch.txt[]

include::config/sideband.txt[]

include::config/sparse.txt[]

include::config/splitindex.txt[]
Expand Down
5 changes: 5 additions & 0 deletions Documentation/config/sideband.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
sideband.allowControlCharacters::
By default, control characters that are delivered via the sideband
are masked, to prevent potentially unwanted ANSI escape sequences
from being sent to the terminal. Use this config setting to override
this behavior.
10 changes: 10 additions & 0 deletions sideband.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ static struct keyword_entry keywords[] = {
{ "error", GIT_COLOR_BOLD_RED },
};

static int allow_control_characters;

/* Returns a color setting (GIT_COLOR_NEVER, etc). */
static int use_sideband_colors(void)
{
Expand All @@ -38,6 +40,9 @@ static int use_sideband_colors(void)
if (use_sideband_colors_cached >= 0)
return use_sideband_colors_cached;

git_config_get_bool("sideband.allowcontrolcharacters",
&allow_control_characters);

if (!git_config_get_string_tmp(key, &value))
use_sideband_colors_cached = git_config_colorbool(key, value);
else if (!git_config_get_string_tmp("color.ui", &value))
Expand Down Expand Up @@ -67,6 +72,11 @@ void list_config_color_sideband_slots(struct string_list *list, const char *pref

static void strbuf_add_sanitized(struct strbuf *dest, const char *src, int n)
{
if (allow_control_characters) {
strbuf_add(dest, src, n);
return;
}

strbuf_grow(dest, n);
for (; n && *src; src++, n--) {
if (!iscntrl(*src) || *src == '\t' || *src == '\n')
Expand Down
8 changes: 7 additions & 1 deletion t/t5409-colorize-remote-messages.sh
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,15 @@ test_expect_success 'disallow (color) control sequences in sideband' '
EOF
test_config_global uploadPack.packObjectshook ./color-me-surprised &&
test_commit need-at-least-one-commit &&
git clone --no-local . throw-away 2>stderr &&
test_decode_color <stderr >decoded &&
test_grep ! RED decoded
test_grep ! RED decoded &&
rm -rf throw-away &&
git -c sideband.allowControlCharacters clone --no-local . throw-away 2>stderr &&
test_decode_color <stderr >decoded &&
test_grep RED decoded
'

test_done

0 comments on commit 14c612c

Please sign in to comment.