Message ID | 20210524045412.15152-2-yamamoto@midokura.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | linux-user changes to run docker | expand |
YAMAMOTO Takashi <yamamoto@midokura.com> writes: > It seems somehow common to execve /proc/self/exe in docker > or golang community these days. > At least, moby "reexec" and runc "libcontainer" do that. > > Signed-off-by: YAMAMOTO Takashi <yamamoto@midokura.com> > --- > linux-user/syscall.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index c9f812091c..a2b03ecb8b 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -8470,6 +8470,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1, > #endif > case TARGET_NR_execve: > { > + const char *path; > char **argp, **envp; > int argc, envc; > abi_ulong gp; > @@ -8537,7 +8538,11 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1, > * before the execve completes and makes it the other > * program's problem. > */ > - ret = get_errno(safe_execve(p, argp, envp)); > + path = p; > + if (is_proc_myself(path, "exe")) { > + path = exec_path; > + } This still relies on binfmt_misc kicking in to ensure the binary is re-executed with qemu right? > + ret = get_errno(safe_execve(path, argp, envp)); > unlock_user(p, arg1, 0); > > goto execve_end;
On Mon, May 24, 2021 at 7:53 PM Alex Bennée <alex.bennee@linaro.org> wrote: > > > YAMAMOTO Takashi <yamamoto@midokura.com> writes: > > > It seems somehow common to execve /proc/self/exe in docker > > or golang community these days. > > At least, moby "reexec" and runc "libcontainer" do that. > > > > Signed-off-by: YAMAMOTO Takashi <yamamoto@midokura.com> > > --- > > linux-user/syscall.c | 7 ++++++- > > 1 file changed, 6 insertions(+), 1 deletion(-) > > > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > > index c9f812091c..a2b03ecb8b 100644 > > --- a/linux-user/syscall.c > > +++ b/linux-user/syscall.c > > @@ -8470,6 +8470,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1, > > #endif > > case TARGET_NR_execve: > > { > > + const char *path; > > char **argp, **envp; > > int argc, envc; > > abi_ulong gp; > > @@ -8537,7 +8538,11 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1, > > * before the execve completes and makes it the other > > * program's problem. > > */ > > - ret = get_errno(safe_execve(p, argp, envp)); > > + path = p; > > + if (is_proc_myself(path, "exe")) { > > + path = exec_path; > > + } > > This still relies on binfmt_misc kicking in to ensure the binary is > re-executed with qemu right? right. > > > + ret = get_errno(safe_execve(path, argp, envp)); > > unlock_user(p, arg1, 0); > > > > goto execve_end; > > > -- > Alex Bennée
diff --git a/linux-user/syscall.c b/linux-user/syscall.c index c9f812091c..a2b03ecb8b 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -8470,6 +8470,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1, #endif case TARGET_NR_execve: { + const char *path; char **argp, **envp; int argc, envc; abi_ulong gp; @@ -8537,7 +8538,11 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1, * before the execve completes and makes it the other * program's problem. */ - ret = get_errno(safe_execve(p, argp, envp)); + path = p; + if (is_proc_myself(path, "exe")) { + path = exec_path; + } + ret = get_errno(safe_execve(path, argp, envp)); unlock_user(p, arg1, 0); goto execve_end;
It seems somehow common to execve /proc/self/exe in docker or golang community these days. At least, moby "reexec" and runc "libcontainer" do that. Signed-off-by: YAMAMOTO Takashi <yamamoto@midokura.com> --- linux-user/syscall.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)