From 1a5b10277f5b153b9f2e981695f7fb443218282b Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Tue, 16 Oct 2018 11:25:29 +0900 Subject: [PATCH] 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 --- executer/user/mcexec.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/executer/user/mcexec.c b/executer/user/mcexec.c index 5ba1b3b5..282381e3 100644 --- a/executer/user/mcexec.c +++ b/executer/user/mcexec.c @@ -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; }