execv_dashed_external: stop exiting with negative code

When we try to exec a git sub-command, we pass along the
status code from run_command(). But that may return -1 if we
ran into an error with pipe() or execve(). This tends to
work (and end up as 255 due to twos-complement wraparound
and truncation), but in general it's probably a good idea to
avoid negative exit codes for portability.

We can easily translate to the normal generic "128" code we
get when syscalls cause us to die.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2017-01-06 20:17:48 -05:00 committed by Junio C Hamano
parent 2b296c93d4
commit 246f0edec0

10
git.c
View File

@ -593,12 +593,16 @@ static void execv_dashed_external(const char **argv)
trace_argv_printf(cmd.args.argv, "trace: exec:"); trace_argv_printf(cmd.args.argv, "trace: exec:");
/* /*
* if we fail because the command is not found, it is * If we fail because the command is not found, it is
* OK to return. Otherwise, we just pass along the status code. * OK to return. Otherwise, we just pass along the status code,
* or our usual generic code if we were not even able to exec
* the program.
*/ */
status = run_command(&cmd); status = run_command(&cmd);
if (status >= 0 || errno != ENOENT) if (status >= 0)
exit(status); exit(status);
else if (errno != ENOENT)
exit(128);
} }
static int run_argv(int *argcp, const char ***argv) static int run_argv(int *argcp, const char ***argv)