mirror of
git://git.musl-libc.org/musl
synced 2025-03-09 13:17:37 +00:00
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");
|
const char *p, *z, *path = getenv("PATH");
|
||||||
size_t l, k;
|
size_t l, k;
|
||||||
|
int seen_eacces = 0;
|
||||||
|
|
||||||
errno = ENOENT;
|
errno = ENOENT;
|
||||||
if (!*file) return -1;
|
if (!*file) return -1;
|
||||||
@ -38,9 +39,11 @@ int __execvpe(const char *file, char *const argv[], char *const envp[])
|
|||||||
b[z-p] = '/';
|
b[z-p] = '/';
|
||||||
memcpy(b+(z-p)+(z>p), file, k+1);
|
memcpy(b+(z-p)+(z>p), file, k+1);
|
||||||
execve(b, argv, envp);
|
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 (!*z++) break;
|
||||||
}
|
}
|
||||||
|
if (seen_eacces) errno = EACCES;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user