mirror of
https://github.com/git/git
synced 2024-11-05 18:59:29 +00:00
59a255aef0
The caller of maybe_colorize_sideband() gives a counted buffer <src, n>, but the callee checked src[] as if it were a NUL terminated buffer. If src[] had all isspace() bytes in it, we would have made n negative, and then (1) made number of strncasecmp() calls to see if the remaining bytes in src[] matched keywords, reading beyond the end of the array (this actually happens even if n does not go negative), and/or (2) called strbuf_add() with negative count, most likely triggering the "you want to use way too much memory" error due to unsigned integer overflow. Fix both issues by making sure we do not go beyond &src[n]. In the longer term we may want to accept size_t as parameter for clarity (even though we know that a sideband message we are painting typically would fit on a line on a terminal and int is sufficient). Write it down as a NEEDSWORK comment. Helped-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
101 lines
3.2 KiB
Bash
Executable file
101 lines
3.2 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='remote messages are colorized on the client'
|
|
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success 'setup' '
|
|
mkdir .git/hooks &&
|
|
write_script .git/hooks/update <<-\EOF &&
|
|
echo error: error
|
|
echo ERROR: also highlighted
|
|
echo hint: hint
|
|
echo hinting: not highlighted
|
|
echo success: success
|
|
echo warning: warning
|
|
echo prefixerror: error
|
|
echo " " "error: leading space"
|
|
echo " "
|
|
echo Err
|
|
exit 0
|
|
EOF
|
|
echo 1 >file &&
|
|
git add file &&
|
|
git commit -m 1 &&
|
|
git clone . child &&
|
|
(
|
|
cd child &&
|
|
test_commit message2 file content2
|
|
)
|
|
'
|
|
|
|
test_expect_success 'keywords' '
|
|
git --git-dir child/.git -c color.remote=always push -f origin HEAD:refs/heads/keywords 2>output &&
|
|
test_decode_color <output >decoded &&
|
|
grep "<BOLD;RED>error<RESET>: error" decoded &&
|
|
grep "<YELLOW>hint<RESET>:" decoded &&
|
|
grep "<BOLD;GREEN>success<RESET>:" decoded &&
|
|
grep "<BOLD;YELLOW>warning<RESET>:" decoded
|
|
'
|
|
|
|
test_expect_success 'whole words at line start' '
|
|
git --git-dir child/.git -c color.remote=always push -f origin HEAD:refs/heads/whole-words 2>output &&
|
|
test_decode_color <output >decoded &&
|
|
grep "<YELLOW>hint<RESET>:" decoded &&
|
|
grep "hinting: not highlighted" decoded &&
|
|
grep "prefixerror: error" decoded
|
|
'
|
|
|
|
test_expect_success 'short line' '
|
|
git -C child -c color.remote=always push -f origin HEAD:short-line 2>output &&
|
|
test_decode_color <output >decoded &&
|
|
grep "remote: Err" decoded
|
|
'
|
|
|
|
test_expect_success 'case-insensitive' '
|
|
git --git-dir child/.git -c color.remote=always push -f origin HEAD:refs/heads/case-insensitive 2>output &&
|
|
cat output &&
|
|
test_decode_color <output >decoded &&
|
|
grep "<BOLD;RED>error<RESET>: error" decoded &&
|
|
grep "<BOLD;RED>ERROR<RESET>: also highlighted" decoded
|
|
'
|
|
|
|
test_expect_success 'leading space' '
|
|
git --git-dir child/.git -c color.remote=always push -f origin HEAD:refs/heads/leading-space 2>output && cat output &&
|
|
test_decode_color <output >decoded &&
|
|
grep " <BOLD;RED>error<RESET>: leading space" decoded
|
|
'
|
|
|
|
test_expect_success 'spaces only' '
|
|
git -C child -c color.remote=always push -f origin HEAD:only-space 2>output &&
|
|
test_decode_color <output >decoded &&
|
|
grep "remote: " decoded
|
|
'
|
|
|
|
test_expect_success 'no coloring for redirected output' '
|
|
git --git-dir child/.git push -f origin HEAD:refs/heads/redirected-output 2>output &&
|
|
test_decode_color <output >decoded &&
|
|
grep "error: error" decoded
|
|
'
|
|
|
|
test_expect_success 'push with customized color' '
|
|
git --git-dir child/.git -c color.remote=always -c color.remote.error=blue push -f origin HEAD:refs/heads/customized-color 2>output &&
|
|
test_decode_color <output >decoded &&
|
|
grep "<BLUE>error<RESET>:" decoded &&
|
|
grep "<BOLD;GREEN>success<RESET>:" decoded
|
|
'
|
|
|
|
|
|
test_expect_success 'error in customized color' '
|
|
git --git-dir child/.git -c color.remote=always -c color.remote.error=i-am-not-a-color push -f origin HEAD:refs/heads/error-customized-color 2>output &&
|
|
test_decode_color <output >decoded &&
|
|
grep "<BOLD;GREEN>success<RESET>:" decoded
|
|
'
|
|
|
|
test_expect_success 'fallback to color.ui' '
|
|
git --git-dir child/.git -c color.ui=always push -f origin HEAD:refs/heads/fallback-color-ui 2>output &&
|
|
test_decode_color <output >decoded &&
|
|
grep "<BOLD;RED>error<RESET>: error" decoded
|
|
'
|
|
|
|
test_done
|