stateless-connect: send response end packet
Currently, remote-curl acts as a proxy and blindly forwards packets between an HTTP server and fetch-pack. In the case of a stateless RPC connection where the connection is terminated before the transaction is complete, remote-curl will blindly forward the packets before waiting on more input from fetch-pack. Meanwhile, fetch-pack will read the transaction and continue reading, expecting more input to continue the transaction. This results in a deadlock between the two processes. This can be seen in the following command which does not terminate: $ git -c protocol.version=2 clone https://github.com/git/git.git --shallow-since=20151012 Cloning into 'git'... whereas the v1 version does terminate as expected: $ git -c protocol.version=1 clone https://github.com/git/git.git --shallow-since=20151012 Cloning into 'git'... fatal: the remote end hung up unexpectedly Instead of blindly forwarding packets, make remote-curl insert a response end packet after proxying the responses from the remote server when using stateless_connect(). On the RPC client side, ensure that each response ends as described. A separate control packet is chosen because we need to be able to differentiate between what the remote server sends and remote-curl's control packets. By ensuring in the remote-curl code that a server cannot send response end packets, we prevent a malicious server from being able to perform a denial of service attack in which they spoof a response end packet and cause the described deadlock to happen. Reported-by: Force Charlie <charlieio@outlook.com> Helped-by: Jeff King <peff@peff.net> Signed-off-by: Denton Liu <liu.denton@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
0181b600a6
commit
b0df0c16ea
@ -620,6 +620,19 @@ test_expect_success 'clone repository with http:// using protocol v2 with incomp
|
||||
test_i18ngrep "bytes of body are still expected" err
|
||||
'
|
||||
|
||||
test_expect_success 'clone with http:// using protocol v2 and invalid parameters' '
|
||||
test_when_finished "rm -f log" &&
|
||||
|
||||
test_must_fail env GIT_TRACE_PACKET="$(pwd)/log" GIT_TRACE_CURL="$(pwd)/log" \
|
||||
git -c protocol.version=2 \
|
||||
clone --shallow-since=20151012 "$HTTPD_URL/smart/http_parent" http_child_invalid &&
|
||||
|
||||
# Client requested to use protocol v2
|
||||
grep "Git-Protocol: version=2" log &&
|
||||
# Server responded using protocol v2
|
||||
grep "git< version 2" log
|
||||
'
|
||||
|
||||
test_expect_success 'clone big repository with http:// using protocol v2' '
|
||||
test_when_finished "rm -f log" &&
|
||||
|
||||
|
||||
Reference in New Issue
Block a user