From c5e21394c9378124b17cdf9c4a1c09b119cfba17 Mon Sep 17 00:00:00 2001 From: Tonis Tiigi Date: Thu, 20 Jan 2022 21:03:32 -0800 Subject: [PATCH] enable preserve-argv0 by default on mainline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit P flag is needed in order for qemu to not lose argv0 value. Problem is that qemu can only detect that flag was set on 5.12+ kernels and if it doesn’t detect it then all argument values are wrong. This introduces a patch that is enabled on mainline target that assumes P flag was set if the kernel does not provide any flags. Signed-off-by: Tonis Tiigi --- Dockerfile | 6 ++++ cmd/binfmt/main.go | 2 +- docker-bake.hcl | 2 ++ ...linux-user-default-to-preserve-argv0.patch | 29 ++++++++++++++++ test/Dockerfile | 2 +- test/argv0_test.go | 33 +++++++++++++++++++ 6 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 patches/preserve-argv0/0001-linux-user-default-to-preserve-argv0.patch create mode 100644 test/argv0_test.go diff --git a/Dockerfile b/Dockerfile index 1da3f94a..6bdb9721 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,6 +21,7 @@ RUN git clone $QEMU_REPO && cd qemu && git checkout $QEMU_VERSION COPY patches patches ARG QEMU_PATCHES=cpu-max ARG QEMU_PATCHES_ALL=${QEMU_PATCHES},alpine-patches,zero-init-msghdr,sched +ARG QEMU_PRESERVE_ARGV0 RUN < +Date: Thu, 20 Jan 2022 20:21:07 -0800 +Subject: [PATCH] linux-user: default to preserve-argv0 + +Signed-off-by: Tonis Tiigi +--- + linux-user/main.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/linux-user/main.c b/linux-user/main.c +index 37ed50d98e..87e76845dc 100644 +--- a/linux-user/main.c ++++ b/linux-user/main.c +@@ -706,6 +706,11 @@ int main(int argc, char **argv, char **envp) + * get binfmt_misc flags + */ + preserve_argv0 = !!(qemu_getauxval(AT_FLAGS) & AT_FLAGS_PRESERVE_ARGV0); ++ ++ // default to preserve_argv0 on older kernels ++ if (qemu_getauxval(AT_FLAGS) == 0) { ++ preserve_argv0 = 1; ++ } + + /* + * Manage binfmt-misc preserve-arg[0] flag +-- +2.32.0 (Apple Git-132) + diff --git a/test/Dockerfile b/test/Dockerfile index 9887f312..7c86aeb9 100644 --- a/test/Dockerfile +++ b/test/Dockerfile @@ -25,6 +25,6 @@ FROM alpine AS run RUN apk add libcap COPY --from=binary / /usr/bin ARG CONFIG_RT_GROUP_SCHED -RUN --security=insecure /usr/bin/test -test.v +RUN --security=insecure REEXEC_NAME=/usr/bin/test /usr/bin/test -test.v FROM binary \ No newline at end of file diff --git a/test/argv0_test.go b/test/argv0_test.go new file mode 100644 index 00000000..5635cc0f --- /dev/null +++ b/test/argv0_test.go @@ -0,0 +1,33 @@ +package tests + +import ( + "fmt" + "os" + "os/exec" + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func init() { + if v := os.Getenv("BINFMT_ARGV0_TEST"); v != "" { + fmt.Println(strings.Join(os.Args, ",")) + os.Exit(0) + } +} + +func TestArgv0(t *testing.T) { + self := "/proc/self/exe" + if v, ok := os.LookupEnv("REEXEC_NAME"); ok { + self = v + } + cmd := &exec.Cmd{ + Path: self, + Env: []string{"BINFMT_ARGV0_TEST=1"}, + Args: []string{"first", "second", "third"}, + } + out, err := cmd.CombinedOutput() + require.Equal(t, "first,second,third\n", string(out)) + require.NoError(t, err) +}