diff options
author | Jeff King <peff@peff.net> | 2017-01-07 02:17:48 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-01-09 22:41:35 +0100 |
commit | 246f0edec0b789ccfeebcf7fef85417b7cb04425 (patch) | |
tree | 5ab877ad21dceefc6ce5233270b1863c00f18ecb /git.c | |
parent | execv_dashed_external: use child_process struct (diff) | |
download | git-246f0edec0b789ccfeebcf7fef85417b7cb04425.tar.xz git-246f0edec0b789ccfeebcf7fef85417b7cb04425.zip |
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>
Diffstat (limited to 'git.c')
-rw-r--r-- | git.c | 10 |
1 files changed, 7 insertions, 3 deletions
@@ -593,12 +593,16 @@ static void execv_dashed_external(const char **argv) trace_argv_printf(cmd.args.argv, "trace: exec:"); /* - * if we fail because the command is not found, it is - * OK to return. Otherwise, we just pass along the status code. + * If we fail because the command is not found, it is + * 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); - if (status >= 0 || errno != ENOENT) + if (status >= 0) exit(status); + else if (errno != ENOENT) + exit(128); } static int run_argv(int *argcp, const char ***argv) |