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

start_command: close cmd->err descriptor when fork/spawn fails

Fix the problem where the cmd->err passed into start_command wasn't being properly closed when certain types of errors occurr. (Compare the affected code with the clean shutdown code later in the function.) On Windows, this problem would be triggered if mingw_spawnvpe() failed, which would happen if the command to be executed was malformed (e.g. a text file that didn't start with a #! line). If cmd->err was a pipe, the failure to close it could result in a hang while the other side was waiting (forever) for either input or pipe close, e.g. while trying to shove the output into the side band. On msysGit, this problem was causing a hang in t5516-fetch-push. [J6t: With a slight adjustment of the test case, the hang is also observed on Linux.] Signed-off-by: bert Dvornik <dvornik+git@gmail.com> Signed-off-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>

bert Dvornik committed May 20, 2010 at 20:57 UTC fc012c2810c237dd2299a3fc85b18c2beb60b730
2 files changed +3 -1
run-command.c
+2
@@ -383,6 +383,8 @@ fail_pipe:
383 close(cmd->out);
384 if (need_err)
385 close_pair(fderr);
386 + else if (cmd->err)
387 + close(cmd->err);
388 errno = failed_errno;
389 return -1;
390 }
t/t5516-fetch-push.sh
+1 -1
@@ -528,7 +528,7 @@ test_expect_success 'push does not update local refs on failure' '
528 mk_test heads/master &&
529 mk_child child &&
530 mkdir testrepo/.git/hooks &&
531 - echo exit 1 >testrepo/.git/hooks/pre-receive &&
531 + echo "#!/no/frobnication/today" >testrepo/.git/hooks/pre-receive &&
532 chmod +x testrepo/.git/hooks/pre-receive &&
533 (cd child &&
534 git pull .. master