@matheusbsbs / matheus-bagliano / commits / b4ee10f60f
Fork 0

smart-http: Don't deadlock on server failure

If the remote HTTP server fails (e.g. returns 404 or 500) when we posted the RPC to it, we won't have sent anything to the background Git process that is supposed to handle the stream. Because we didn't send anything, its waiting for input from remote-curl, and remote-curl cannot read its response payload because doing so would lead to a deadlock. Send the background task EOF on its input before we try to read its response back, that way it will break out of its read loop and terminate. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Shawn O. Pearce committed Aug 6, 2010 at 14:19 UTC b4ee10f60fb46e0305968023c1ab0f072535b630
1 file changed +3 -2
remote-curl.c
+3 -2
@@ -505,11 +505,12 @@ static int rpc_service(struct rpc_state *rpc, struct discovery *heads)
505 rpc->len = n;
506 err |= post_rpc(rpc);
507 }
508 - strbuf_read(&rpc->result, client.out, 0);
508
509 close(client.in);
511 - close(client.out);
510 client.in = -1;
511 + strbuf_read(&rpc->result, client.out, 0);
512 +
513 + close(client.out);
514 client.out = -1;
515
516 err |= finish_command(&client);