From: Jonathan Nieder <jrnieder@gmail.com>
To: Jeff King <peff@peff.net>
Cc: Junio C Hamano <gitster@pobox.com>,
James Pickens <jepicken@gmail.com>, Git ML <git@vger.kernel.org>,
Frans Klaver <fransklaver@gmail.com>
Subject: Re: [PATCH 2/2] git: continue alias lookup on EACCES errors
Date: Wed, 28 Mar 2012 15:42:21 -0500 [thread overview]
Message-ID: <20120328204221.GE8982@burratino> (raw)
In-Reply-To: <20120328201851.GA29315@sigill.intra.peff.net>
(cc-ing Frans who had a related itch if I remember correctly[1])
Hi again,
Jeff King wrote:
> --- a/run-command.c
> +++ b/run-command.c
> @@ -76,6 +76,39 @@ static inline void dup_devnull(int to)
> }
> #endif
>
> +static int file_in_path_is_nonexecutable(const char *file)
> +{
> + const char *p = getenv("PATH");
> +
> + if (!p)
> + return 0;
> +
> + while (1) {
> + const char *end = strchrnul(p, ':');
> + const char *path;
> + struct stat st;
> +
> + path = mkpath("%.*s/%s", (int)(end - p), p, file);
> + if (!stat(path, &st) && access(path, X_OK) < 0)
> + return 1;
> +
> + if (!*end)
> + break;
> +
> + p = end + 1;
> + }
> +
> + return 0;
> +}
Nice.
Nitpicks:
- (end - p) is not guaranteed to fit inside an int. What should happen
when my PATH is very long?
- the existence check would be simpler spelled as access(path, F_OK).
- the above checks if there is _any_ nonexecutable instance of "file"
in the directories listed in $PATH, but isn't what we want to check
whether _all_ of them are nonexecutable?
> +
> +int sane_execvp(const char *file, char * const argv[])
> +{
> + int ret = execvp(file, argv);
> + if (ret < 0 && errno == EACCES && !file_in_path_is_nonexecutable(file))
> + errno = ENOENT;
> + return ret;
> +}
Makes sense. No objections from me.
if (!execvp(file, argv))
return 0;
/*
* When a command can't be found because one of the directories
* listed in $PATH is unsearchable, execvp reports EACCES, but
* careful usability testing (read: analysis of occasional bug
* reports) reveals that "No such file or directory" is more
* intuitive.
*/
if (errno == EACCES && cannot_find_in_PATH(file))
errno = ENOENT;
return -1;
Thanks,
Jonathan
[1] http://thread.gmane.org/gmane.comp.version-control.git/189077/focus=189913
next prev parent reply other threads:[~2012-03-28 20:42 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-26 23:48 Bug? Bad permissions in $PATH breaks Git aliases James Pickens
2012-03-27 3:19 ` Jeff King
2012-03-27 7:25 ` James Pickens
2012-03-27 15:11 ` Junio C Hamano
2012-03-27 17:59 ` Jeff King
2012-03-27 18:04 ` [PATCH 1/2] run-command: propagate EACCES errors to parent Jeff King
2012-03-27 18:24 ` Junio C Hamano
2012-03-27 18:33 ` Jeff King
2012-03-27 18:05 ` [PATCH 2/2] git: continue alias lookup on EACCES errors Jeff King
2012-03-27 19:16 ` Junio C Hamano
2012-03-28 4:30 ` Jeff King
2012-03-28 17:42 ` Junio C Hamano
2012-03-28 17:48 ` Jeff King
2012-03-28 18:04 ` Jonathan Nieder
2012-03-28 18:31 ` Junio C Hamano
2012-03-28 18:40 ` Jonathan Nieder
2012-03-28 19:39 ` Jeff King
2012-03-28 19:45 ` Jonathan Nieder
2012-03-28 20:18 ` Jeff King
2012-03-28 20:37 ` Jeff King
2012-03-28 20:51 ` Jonathan Nieder
2012-03-28 20:52 ` Jeff King
2012-03-28 20:42 ` Jonathan Nieder [this message]
2012-03-28 20:51 ` Jeff King
2012-03-28 21:01 ` Jonathan Nieder
2012-03-28 21:25 ` Jeff King
2012-03-28 21:30 ` Frans Klaver
2012-03-28 20:43 ` Junio C Hamano
2012-03-28 21:04 ` Jeff King
2012-03-28 21:44 ` Junio C Hamano
2012-03-28 21:57 ` Jeff King
2012-03-28 22:07 ` Jeff King
2012-03-28 22:18 ` Junio C Hamano
2012-03-29 11:31 ` Frans Klaver
2012-03-29 17:20 ` Jeff King
2012-03-29 17:23 ` Frans Klaver
2012-03-28 19:38 ` Jeff King
2012-03-28 18:29 ` Junio C Hamano
2012-03-28 19:40 ` Jeff King
2012-03-29 11:16 ` Frans Klaver
2012-03-29 17:15 ` Jeff King
2012-03-29 17:21 ` Frans Klaver
2012-03-27 6:14 ` Bug? Bad permissions in $PATH breaks Git aliases Johannes Sixt
2012-03-27 7:37 ` James Pickens
2012-03-27 15:14 ` Junio C Hamano
2012-03-27 17:48 ` James Pickens
2012-03-27 18:03 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120328204221.GE8982@burratino \
--to=jrnieder@gmail.com \
--cc=fransklaver@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jepicken@gmail.com \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).