Skip to content

Commit 49ecfa1

Browse files
peffgitster
authored andcommitted
receive-pack: close sideband fd on early pack errors
Since commit a22e6f8 (receive-pack: send pack-processing stderr over sideband, 2012-09-21), receive-pack will start an async sideband thread to copy the stderr from our index-pack or unpack-objects child to the client. We hand the thread's input descriptor to unpack(), which puts it in the "err" member of the "struct child_process". After unpack() returns, we use finish_async() to reap the sideband thread. The thread is only ready to die when it gets EOF on its pipe, which is connected to the err descriptor. So we expect all of the write ends of that pipe to be closed as part of unpack(). Normally, this works fine. After start_command forks, it closes the parent copy of the descriptor. Then once the child exits (whether it was successful or not), that closes the only remaining writer. However, there is one code-path in unpack() that does not handle this. Before we decide which of unpack-objects or index-pack to use, we read the pack header ourselves to see how many objects it contains. If there is an error here, we exit without running either sub-command, the pipe descriptor remains open, and we are in a deadlock, waiting for the sideband thread to die (which is in turn waiting for us to close the pipe). We can fix this by making sure that unpack() always closes the pipe before returning. Signed-off-by: Jeff King <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 04a74b6 commit 49ecfa1

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

builtin/receive-pack.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -807,8 +807,11 @@ static const char *unpack(int err_fd)
807807
: 0);
808808

809809
hdr_err = parse_pack_header(&hdr);
810-
if (hdr_err)
810+
if (hdr_err) {
811+
if (err_fd > 0)
812+
close(err_fd);
811813
return hdr_err;
814+
}
812815
snprintf(hdr_arg, sizeof(hdr_arg),
813816
"--pack_header=%"PRIu32",%"PRIu32,
814817
ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));

0 commit comments

Comments
 (0)