mcexec: load_elf: disable execvp for within-mckernel execs
the libc takes care of trying execve as many times as needed for
execvp, it's not a kernel call.
Also, sneak a double-free fix (desc was not reset properly in case
load_elf_desc_shebang failed)
Fixes: b1681f4a3affff ("mcexec/execve: fix shebangs handling")
Change-Id: If8e3d7ae53acdeffc0331ae8621e0832fcfa406f
This commit is contained in:
@ -766,13 +766,14 @@ int load_elf_desc(char *filename, struct program_load_desc **desc_p,
|
||||
*/
|
||||
int load_elf_desc_shebang(char *shebang_argv0,
|
||||
struct program_load_desc **desc_p,
|
||||
char ***shebang_argv_p)
|
||||
char ***shebang_argv_p,
|
||||
int execvp)
|
||||
{
|
||||
char path[PATH_MAX];
|
||||
char *shebang = NULL;
|
||||
int ret;
|
||||
|
||||
if ((ret = lookup_exec_path(shebang_argv0, path, sizeof(path), 1))
|
||||
if ((ret = lookup_exec_path(shebang_argv0, path, sizeof(path), execvp))
|
||||
!= 0) {
|
||||
__dprintf("error: finding file: %s\n", shebang_argv0);
|
||||
return ret;
|
||||
@ -790,7 +791,8 @@ int load_elf_desc_shebang(char *shebang_argv0,
|
||||
char **shebang_argv;
|
||||
|
||||
if (!shebang_argv_p)
|
||||
return load_elf_desc_shebang(shebang, desc_p, NULL);
|
||||
return load_elf_desc_shebang(shebang, desc_p,
|
||||
NULL, execvp);
|
||||
|
||||
shebang_argv = *shebang_argv_p;
|
||||
|
||||
@ -825,7 +827,8 @@ int load_elf_desc_shebang(char *shebang_argv0,
|
||||
|
||||
*shebang_argv_p = shebang_argv;
|
||||
|
||||
return load_elf_desc_shebang(shebang, desc_p, shebang_argv_p);
|
||||
return load_elf_desc_shebang(shebang, desc_p, shebang_argv_p,
|
||||
execvp);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -2399,7 +2402,7 @@ int main(int argc, char **argv)
|
||||
#endif // ENABLE_MCOVERLAYFS
|
||||
|
||||
if ((ret = load_elf_desc_shebang(argv[optind], &desc,
|
||||
&shebang_argv))) {
|
||||
&shebang_argv, 1 /* execvp */))) {
|
||||
fprintf(stderr, "%s: could not load program: %s\n",
|
||||
argv[optind], strerror(ret));
|
||||
return 1;
|
||||
@ -3711,10 +3714,11 @@ fork_err:
|
||||
case 1:
|
||||
shebang_argv = NULL;
|
||||
buffer = NULL;
|
||||
desc = NULL;
|
||||
filename = (char *)w.sr.args[1];
|
||||
|
||||
if ((ret = load_elf_desc_shebang(filename, &desc,
|
||||
&shebang_argv)) != 0) {
|
||||
&shebang_argv, 0)) != 0) {
|
||||
goto return_execve1;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user