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:
Dominique Martinet
2018-10-16 11:25:29 +09:00
parent a59c55c188
commit 1a5b10277f

View File

@ -766,13 +766,14 @@ int load_elf_desc(char *filename, struct program_load_desc **desc_p,
*/ */
int load_elf_desc_shebang(char *shebang_argv0, int load_elf_desc_shebang(char *shebang_argv0,
struct program_load_desc **desc_p, struct program_load_desc **desc_p,
char ***shebang_argv_p) char ***shebang_argv_p,
int execvp)
{ {
char path[PATH_MAX]; char path[PATH_MAX];
char *shebang = NULL; char *shebang = NULL;
int ret; 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) { != 0) {
__dprintf("error: finding file: %s\n", shebang_argv0); __dprintf("error: finding file: %s\n", shebang_argv0);
return ret; return ret;
@ -790,7 +791,8 @@ int load_elf_desc_shebang(char *shebang_argv0,
char **shebang_argv; char **shebang_argv;
if (!shebang_argv_p) 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; shebang_argv = *shebang_argv_p;
@ -825,7 +827,8 @@ int load_elf_desc_shebang(char *shebang_argv0,
*shebang_argv_p = shebang_argv; *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; return 0;
@ -2399,7 +2402,7 @@ int main(int argc, char **argv)
#endif // ENABLE_MCOVERLAYFS #endif // ENABLE_MCOVERLAYFS
if ((ret = load_elf_desc_shebang(argv[optind], &desc, if ((ret = load_elf_desc_shebang(argv[optind], &desc,
&shebang_argv))) { &shebang_argv, 1 /* execvp */))) {
fprintf(stderr, "%s: could not load program: %s\n", fprintf(stderr, "%s: could not load program: %s\n",
argv[optind], strerror(ret)); argv[optind], strerror(ret));
return 1; return 1;
@ -3711,10 +3714,11 @@ fork_err:
case 1: case 1:
shebang_argv = NULL; shebang_argv = NULL;
buffer = NULL; buffer = NULL;
desc = NULL;
filename = (char *)w.sr.args[1]; filename = (char *)w.sr.args[1];
if ((ret = load_elf_desc_shebang(filename, &desc, if ((ret = load_elf_desc_shebang(filename, &desc,
&shebang_argv)) != 0) { &shebang_argv, 0)) != 0) {
goto return_execve1; goto return_execve1;
} }