44d2aec6e8
parse_feature_value() takes an offset, and uses it to seek past the
point in features_list that we've already seen. However if the feature
being searched for does not specify a value, the offset is not
updated. Therefore if we call parse_feature_value() in a loop on a
value-less feature, we'll keep on parsing the same feature over and over
again. This usually isn't an issue: there's no point in using
next_server_feature_value() to search for repeated instances of the same
capability unless that capability typically specifies a value - but a
broken server could send a response that omits the value for a feature
even when we are expecting a value.
Therefore we add an offset update calculation for the no-value case,
which helps ensure that loops using next_server_feature_value() will
always terminate.
next_server_feature_value(), and the offset calculation, were first
added in 2.28 in 2c6a403d96
(connect: add function to parse multiple
v1 capability values, 2020-05-25).
Thanks to Peff for authoring the test.
Co-authored-by: Jeff King <peff@peff.net>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Andrzej Hunt <andrzej@ahunt.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
51 lines
1.5 KiB
Bash
Executable File
51 lines
1.5 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
test_description='Test responses to violations of the network protocol. In most
|
|
of these cases it will generally be acceptable for one side to break off
|
|
communications if the other side says something unexpected. We are mostly
|
|
making sure that we do not segfault or otherwise behave badly.'
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success 'extra delim packet in v2 ls-refs args' '
|
|
{
|
|
packetize command=ls-refs &&
|
|
packetize "object-format=$(test_oid algo)" &&
|
|
printf 0001 &&
|
|
# protocol expects 0000 flush here
|
|
printf 0001
|
|
} >input &&
|
|
test_must_fail env GIT_PROTOCOL=version=2 \
|
|
git upload-pack . <input 2>err &&
|
|
test_i18ngrep "expected flush after ls-refs arguments" err
|
|
'
|
|
|
|
test_expect_success 'extra delim packet in v2 fetch args' '
|
|
{
|
|
packetize command=fetch &&
|
|
packetize "object-format=$(test_oid algo)" &&
|
|
printf 0001 &&
|
|
# protocol expects 0000 flush here
|
|
printf 0001
|
|
} >input &&
|
|
test_must_fail env GIT_PROTOCOL=version=2 \
|
|
git upload-pack . <input 2>err &&
|
|
test_i18ngrep "expected flush after fetch arguments" err
|
|
'
|
|
|
|
test_expect_success 'bogus symref in v0 capabilities' '
|
|
test_commit foo &&
|
|
oid=$(git rev-parse HEAD) &&
|
|
dst=refs/heads/foo &&
|
|
{
|
|
printf "%s HEAD\0symref object-format=%s symref=HEAD:%s\n" \
|
|
"$oid" "$GIT_DEFAULT_HASH" "$dst" |
|
|
test-tool pkt-line pack-raw-stdin &&
|
|
printf "0000"
|
|
} >input &&
|
|
git ls-remote --symref --upload-pack="cat input; read junk;:" . >actual &&
|
|
printf "ref: %s\tHEAD\n%s\tHEAD\n" "$dst" "$oid" >expect &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_done
|