mirror of git://git.musl-libc.org/musl
make execvp continue PATH search on EACCES rather than issuing an errror
the specification for execvp itself is unclear as to whether encountering a file that cannot be executed due to EACCES during the PATH search is a mandatory error condition; however, XBD 8.3's specification of the PATH environment variable clarifies that the search continues until a file with "appropriate execution permissions" is found. since it seems undesirable/erroneous to report ENOENT rather than EACCES when an early path element has a non-executable file and all later path elements lack any file by the requested name, the new code stores a flag indicating that EACCES was seen and sets errno back to EACCES in this case.
This commit is contained in:
parent
3559f0b894
commit
14a0117117
|
@ -11,6 +11,7 @@ int __execvpe(const char *file, char *const argv[], char *const envp[])
|
|||
{
|
||||
const char *p, *z, *path = getenv("PATH");
|
||||
size_t l, k;
|
||||
int seen_eacces = 0;
|
||||
|
||||
errno = ENOENT;
|
||||
if (!*file) return -1;
|
||||
|
@ -38,9 +39,11 @@ int __execvpe(const char *file, char *const argv[], char *const envp[])
|
|||
b[z-p] = '/';
|
||||
memcpy(b+(z-p)+(z>p), file, k+1);
|
||||
execve(b, argv, envp);
|
||||
if (errno != ENOENT) return -1;
|
||||
if (errno == EACCES) seen_eacces = 1;
|
||||
else if (errno != ENOENT) return -1;
|
||||
if (!*z++) break;
|
||||
}
|
||||
if (seen_eacces) errno = EACCES;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue