Message ID | f7fb7a38333cf6527345e3dbefaeb2cd8ade6429.1736878772.git.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Sanitize sideband channel messages | expand |
Hi Dscho Just a couple of small comments On 14/01/2025 18:19, Johannes Schindelin via GitGitGadget wrote: > From: Johannes Schindelin <johannes.schindelin@gmx.de> > > +static void strbuf_add_sanitized(struct strbuf *dest, const char *src, int n) > +{ > + strbuf_grow(dest, n); > + for (; n && *src; src++, n--) { > + if (!iscntrl(*src) || *src == '\t' || *src == '\n') Isn't it a bug to pass '\n' to maybe_colorize_sideband() ? > + strbuf_addch(dest, *src); > + else { > + strbuf_addch(dest, '^'); > + strbuf_addch(dest, 0x40 + *src); This will escape DEL ('\x7f') as "^\xbf" which is invalid in utf-8 locales. Perhaps we could use "^?" for that instead. > +test_expect_success 'disallow (color) control sequences in sideband' ' > + write_script .git/color-me-surprised <<-\EOF && > + printf "error: Have you \\033[31mread\\033[m this?\\n" >&2 > + exec "$@" > + 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 I'd be happier if we used test_cmp() here so that we check that the sanitized version matches what we expect and the test does not pass if there a typo in the script above stops it from writing the SGR code for red. Best Wishes Phillip
On Jan 14 2025, Johannes Schindelin via GitGitGadget wrote: > diff --git a/sideband.c b/sideband.c > index 02805573fab..c0b1cb044a3 100644 > --- a/sideband.c > +++ b/sideband.c > @@ -65,6 +65,19 @@ void list_config_color_sideband_slots(struct string_list *list, const char *pref > list_config_item(list, prefix, keywords[i].keyword); > } > > +static void strbuf_add_sanitized(struct strbuf *dest, const char *src, int n) > +{ > + strbuf_grow(dest, n); > + for (; n && *src; src++, n--) { > + if (!iscntrl(*src) || *src == '\t' || *src == '\n') The argument of iscntrl needs to be converted to unsigned char.
Andreas Schwab <schwab@linux-m68k.org> writes: > On Jan 14 2025, Johannes Schindelin via GitGitGadget wrote: > >> diff --git a/sideband.c b/sideband.c >> index 02805573fab..c0b1cb044a3 100644 >> --- a/sideband.c >> +++ b/sideband.c >> @@ -65,6 +65,19 @@ void list_config_color_sideband_slots(struct string_list *list, const char *pref >> list_config_item(list, prefix, keywords[i].keyword); >> } >> >> +static void strbuf_add_sanitized(struct strbuf *dest, const char *src, int n) >> +{ >> + strbuf_grow(dest, n); >> + for (; n && *src; src++, n--) { >> + if (!iscntrl(*src) || *src == '\t' || *src == '\n') > > The argument of iscntrl needs to be converted to unsigned char. If this were system-provided one, you are absolutely correct. But I think this comes from sane-ctype.h:15:#undef iscntrl sane-ctype.h:40:#define iscntrl(x) (sane_istest(x,GIT_CNTRL)) and sane_istest() does the casting to uchar for us, so this may be OK (even if it may be a bit misleading).
diff --git a/sideband.c b/sideband.c index 02805573fab..c0b1cb044a3 100644 --- a/sideband.c +++ b/sideband.c @@ -65,6 +65,19 @@ void list_config_color_sideband_slots(struct string_list *list, const char *pref list_config_item(list, prefix, keywords[i].keyword); } +static void strbuf_add_sanitized(struct strbuf *dest, const char *src, int n) +{ + strbuf_grow(dest, n); + for (; n && *src; src++, n--) { + if (!iscntrl(*src) || *src == '\t' || *src == '\n') + strbuf_addch(dest, *src); + else { + strbuf_addch(dest, '^'); + strbuf_addch(dest, 0x40 + *src); + } + } +} + /* * Optionally highlight one keyword in remote output if it appears at the start * of the line. This should be called for a single line only, which is @@ -80,7 +93,7 @@ static void maybe_colorize_sideband(struct strbuf *dest, const char *src, int n) int i; if (!want_color_stderr(use_sideband_colors())) { - strbuf_add(dest, src, n); + strbuf_add_sanitized(dest, src, n); return; } @@ -113,7 +126,7 @@ static void maybe_colorize_sideband(struct strbuf *dest, const char *src, int n) } } - strbuf_add(dest, src, n); + strbuf_add_sanitized(dest, src, n); } diff --git a/t/t5409-colorize-remote-messages.sh b/t/t5409-colorize-remote-messages.sh index 516b22fd963..61126e2b167 100755 --- a/t/t5409-colorize-remote-messages.sh +++ b/t/t5409-colorize-remote-messages.sh @@ -99,4 +99,16 @@ test_expect_success 'fallback to color.ui' ' grep "<BOLD;RED>error<RESET>: error" decoded ' +test_expect_success 'disallow (color) control sequences in sideband' ' + write_script .git/color-me-surprised <<-\EOF && + printf "error: Have you \\033[31mread\\033[m this?\\n" >&2 + exec "$@" + 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_done