b0df0c16ea
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> |
||
---|---|---|
.. | ||
.gitignore | ||
api-error-handling.txt | ||
api-index-skel.txt | ||
api-index.sh | ||
api-merge.txt | ||
api-parse-options.txt | ||
api-trace2.txt | ||
bitmap-format.txt | ||
bundle-format.txt | ||
commit-graph-format.txt | ||
commit-graph.txt | ||
directory-rename-detection.txt | ||
hash-function-transition.txt | ||
http-protocol.txt | ||
index-format.txt | ||
long-running-process-protocol.txt | ||
multi-pack-index.txt | ||
pack-format.txt | ||
pack-heuristics.txt | ||
pack-protocol.txt | ||
partial-clone.txt | ||
protocol-capabilities.txt | ||
protocol-common.txt | ||
protocol-v2.txt | ||
racy-git.txt | ||
repository-version.txt | ||
rerere.txt | ||
send-pack-pipeline.txt | ||
shallow.txt | ||
signature-format.txt | ||
trivial-merge.txt |