Allow callers to specify the directory against which to resolve the program filename. Enables running executables from private mounts.
Signed-off-by: Thomas Weißschuh <[email protected]> --- fs/exec.c | 4 ++-- include/linux/binfmts.h | 2 +- init/main.c | 2 +- kernel/umh.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fs/exec.c b/fs/exec.c index ba12b4c466f6..affae4b4f6f6 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -1846,7 +1846,7 @@ static int do_execveat_common(int fd, struct filename *filename, return bprm_execve(bprm); } -int kernel_execve(const char *kernel_filename, +int kernel_execve(int dirfd, const char *kernel_filename, const char *const *argv, const char *const *envp) { int retval; @@ -1856,7 +1856,7 @@ int kernel_execve(const char *kernel_filename, return -EINVAL; CLASS(filename_kernel, filename)(kernel_filename); - CLASS(bprm, bprm)(AT_FDCWD, filename, 0); + CLASS(bprm, bprm)(dirfd, filename, 0); if (IS_ERR(bprm)) return PTR_ERR(bprm); diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h index 65abd5ab8836..04e2b7a85b2b 100644 --- a/include/linux/binfmts.h +++ b/include/linux/binfmts.h @@ -144,7 +144,7 @@ int copy_string_kernel(const char *arg, struct linux_binprm *bprm); extern void set_binfmt(struct linux_binfmt *new); extern ssize_t read_code(struct file *, unsigned long, loff_t, size_t); -int kernel_execve(const char *filename, +int kernel_execve(int dirfd, const char *filename, const char *const *argv, const char *const *envp); #endif /* _LINUX_BINFMTS_H */ diff --git a/init/main.c b/init/main.c index 96f93bb06c49..551d03681234 100644 --- a/init/main.c +++ b/init/main.c @@ -1511,7 +1511,7 @@ static int run_init_process(const char *init_filename) pr_debug(" with environment:\n"); for (p = envp_init; *p; p++) pr_debug(" %s\n", *p); - return kernel_execve(init_filename, argv_init, envp_init); + return kernel_execve(AT_FDCWD, init_filename, argv_init, envp_init); } static int try_to_run_init_process(const char *init_filename) diff --git a/kernel/umh.c b/kernel/umh.c index cffda97d961c..bab134fa8c36 100644 --- a/kernel/umh.c +++ b/kernel/umh.c @@ -106,7 +106,7 @@ static int call_usermodehelper_exec_async(void *data) commit_creds(new); wait_for_initramfs(); - retval = kernel_execve(sub_info->path, + retval = kernel_execve(AT_FDCWD, sub_info->path, (const char *const *)sub_info->argv, (const char *const *)sub_info->envp); out: -- 2.53.0

