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 | ||