Skip to content

Commit

Permalink
run-command: forbid using run_command with piped output
Browse files Browse the repository at this point in the history
Because run_command both spawns and wait()s for the command
before returning control to the caller, any reads from the
pipes we open must necessarily happen after wait() returns.
This can lead to deadlock, as the child process may block
on writing to us while we are blocked waiting for it to
exit.

Worse, it only happens when the child fills the pipe
buffer, which means that the problem may come and go
depending on the platform and the size of the output
produced by the child.

Let's detect and flag this dangerous construct so that we
can catch potential bugs early in the test suite rather than
having them happen in the field.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Mar 23, 2015
1 parent c5eadca commit c29b396
Showing 1 changed file with 6 additions and 1 deletion.
7 changes: 6 additions & 1 deletion run-command.c
Original file line number Diff line number Diff line change
Expand Up @@ -561,7 +561,12 @@ int finish_command(struct child_process *cmd)

int run_command(struct child_process *cmd)
{
int code = start_command(cmd);
int code;

if (cmd->out < 0 || cmd->err < 0)
die("BUG: run_command with a pipe can cause deadlock");

code = start_command(cmd);
if (code)
return code;
return finish_command(cmd);
Expand Down

0 comments on commit c29b396

Please sign in to comment.