diff options
author | Jeff King <peff@peff.net> | 2012-03-30 03:52:18 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-04-05 16:24:13 -0700 |
commit | 38f865c27d1f2560afb48efd2b7b105c1278c4b5 (patch) | |
tree | 5b4368c4261b4351a19cb2eec1fe2b01aaa6d0f3 /exec_cmd.c | |
parent | 1696d72321492c05bebd1e823de0708c13ec7d72 (diff) | |
download | git-38f865c27d1f2560afb48efd2b7b105c1278c4b5.tar.gz git-38f865c27d1f2560afb48efd2b7b105c1278c4b5.tar.xz |
run-command: treat inaccessible directories as ENOENT
When execvp reports EACCES, it can be one of two things:
1. We found a file to execute, but did not have
permissions to do so.
2. We did not have permissions to look in some directory
in the $PATH.
In the former case, we want to consider this a
permissions problem and report it to the user as such (since
getting this for something like "git foo" is likely a
configuration error).
In the latter case, there is a good chance that the
inaccessible directory does not contain anything of
interest. Reporting "permission denied" is confusing to the
user (and prevents our usual "did you mean...?" lookup). It
also prevents git from trying alias lookup, since we do so
only when an external command does not exist (not when it
exists but has an error).
This patch detects EACCES from execvp, checks whether we are
in case (2), and if so converts errno to ENOENT. This
behavior matches that of "bash" (but not of simpler shells
that use execvp more directly, like "dash").
Test stolen from Junio.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'exec_cmd.c')
-rw-r--r-- | exec_cmd.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/exec_cmd.c b/exec_cmd.c index 171e84153..125fa6fab 100644 --- a/exec_cmd.c +++ b/exec_cmd.c @@ -134,7 +134,7 @@ int execv_git_cmd(const char **argv) { trace_argv_printf(nargv, "trace: exec:"); /* execvp() can only ever return if it fails */ - execvp("git", (char **)nargv); + sane_execvp("git", (char **)nargv); trace_printf("trace: exec failed: %s\n", strerror(errno)); |