sideband: introduce an "escape hatch" to allow control characters

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 <johannes.schindelin@gmx.de>
This commit is contained in:
Johannes Schindelin 2024-11-06 21:07:51 +01:00
parent 873fe23b56
commit 268465a5f7
4 changed files with 24 additions and 1 deletions

View File

@ -523,6 +523,8 @@ include::config/sequencer.adoc[]
include::config/showbranch.adoc[]
include::config/sideband.adoc[]
include::config/sparse.adoc[]
include::config/splitindex.adoc[]

View File

@ -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.

View File

@ -26,6 +26,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 enum git_colorbool use_sideband_colors(void)
{
@ -39,6 +41,9 @@ static enum git_colorbool use_sideband_colors(void)
if (use_sideband_colors_cached != GIT_COLOR_UNKNOWN)
return use_sideband_colors_cached;
repo_config_get_bool(the_repository, "sideband.allowcontrolcharacters",
&allow_control_characters);
if (!repo_config_get_string_tmp(the_repository, key, &value))
use_sideband_colors_cached = git_config_colorbool(key, value);
else if (!repo_config_get_string_tmp(the_repository, "color.ui", &value))
@ -68,6 +73,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')

View File

@ -105,9 +105,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