From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS31976 209.132.180.0/23 X-Spam-Status: No, score=-2.5 required=3.0 tests=BAYES_00,BODY_8BITS, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL,SPF_HELO_PASS,SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id 795BB1F619 for ; Sun, 1 Mar 2020 00:47:40 +0000 (UTC) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-type :content-transfer-encoding; q=dns; s=default; b=lt9xMyx6rGfINv2a G7yVjikREROV8mV6r4oSxFSqCZu13rL6pSGN2CN6w2v6Sw4EJLQqQxuvbsbq5Hm8 pIGLhz421KD+iX3jQQBEp80yDCosrQb2L2rnO6kztMdH8g0PiQLNlSly7PJukB1d LFQn0N9iGJWHmfqSo58TgBqvpkg= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-type :content-transfer-encoding; s=default; bh=w6hmOuRXEHtEvzA0lhxzRw wZxpU=; b=H+9MERri1mHy48K4J2uM+x9ySW2bhBYxIOc2vLZ/fCy0+otLPL6LqB qoSzNUVBgqsQ1hknNHNua4OOEak8IcFh8MLXr6NoPjcQnFRyRZcVo3RxQHa0nmAA RDTM2B8DaoU00V0Z3ybf76QuJOIyrz4FREFNwqFXl++FUteEtkoMo= Received: (qmail 31977 invoked by alias); 1 Mar 2020 00:47:38 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 31969 invoked by uid 89); 1 Mar 2020 00:47:38 -0000 Authentication-Results: sourceware.org; auth=none X-HELO: mail-qt1-f193.google.com MIME-Version: 1.0 References: <20200128132539.782286-1-laurent@vivier.eu> In-Reply-To: <20200128132539.782286-1-laurent@vivier.eu> From: YunQiang Su Date: Sun, 1 Mar 2020 08:47:23 +0800 Message-ID: Subject: Re: [PATCH v3] binfmt_misc: pass binfmt_misc flags to the interpreter To: Laurent Vivier Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Alexander Viro , James Bottomley , libc-alpha@sourceware.org, linux-arch@vger.kernel.org, linux-api@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Laurent Vivier =E4=BA=8E2020=E5=B9=B41=E6=9C=8828=E6=97= =A5=E5=91=A8=E4=BA=8C =E4=B8=8B=E5=8D=889:25=E5=86=99=E9=81=93=EF=BC=9A > > It can be useful to the interpreter to know which flags are in use. > > For instance, knowing if the preserve-argv[0] is in use would > allow to skip the pathname argument. > > This patch uses an unused auxiliary vector, AT_FLAGS, to add a > flag to inform interpreter if the preserve-argv[0] is enabled. > I am suggested to post linux-arch and/or linux-api. > Signed-off-by: Laurent Vivier > --- > > Notes: > This can be tested with QEMU from my branch: > > https://github.com/vivier/qemu/commits/binfmt-argv0 > > With something like: > > # cp ..../qemu-ppc /chroot/powerpc/jessie > > # qemu-binfmt-conf.sh --qemu-path / --systemd ppc --credential yes = \ > --persistent no --preserve-argv0 yes > # systemctl restart systemd-binfmt.service > # cat /proc/sys/fs/binfmt_misc/qemu-ppc > enabled > interpreter //qemu-ppc > flags: POC > offset 0 > magic 7f454c4601020100000000000000000000020014 > mask ffffffffffffff00fffffffffffffffffffeffff > # chroot /chroot/powerpc/jessie sh -c 'echo $0' > sh > > # qemu-binfmt-conf.sh --qemu-path / --systemd ppc --credential yes = \ > --persistent no --preserve-argv0 no > # systemctl restart systemd-binfmt.service > # cat /proc/sys/fs/binfmt_misc/qemu-ppc > enabled > interpreter //qemu-ppc > flags: OC > offset 0 > magic 7f454c4601020100000000000000000000020014 > mask ffffffffffffff00fffffffffffffffffffeffff > # chroot /chroot/powerpc/jessie sh -c 'echo $0' > /bin/sh > > v3: mix my patch with one from YunQiang Su and my comments on it > introduce a new flag in the uabi for the AT_FLAGS > v2: only pass special flags (remove Magic and Enabled flags) > > fs/binfmt_elf.c | 5 ++++- > fs/binfmt_elf_fdpic.c | 5 ++++- > fs/binfmt_misc.c | 4 +++- > include/linux/binfmts.h | 4 ++++ > include/uapi/linux/binfmts.h | 4 ++++ > 5 files changed, 19 insertions(+), 3 deletions(-) > > diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c > index ecd8d2698515..ff918042ceed 100644 > --- a/fs/binfmt_elf.c > +++ b/fs/binfmt_elf.c > @@ -176,6 +176,7 @@ create_elf_tables(struct linux_binprm *bprm, struct e= lfhdr *exec, > unsigned char k_rand_bytes[16]; > int items; > elf_addr_t *elf_info; > + elf_addr_t flags =3D 0; > int ei_index =3D 0; > const struct cred *cred =3D current_cred(); > struct vm_area_struct *vma; > @@ -250,7 +251,9 @@ create_elf_tables(struct linux_binprm *bprm, struct e= lfhdr *exec, > NEW_AUX_ENT(AT_PHENT, sizeof(struct elf_phdr)); > NEW_AUX_ENT(AT_PHNUM, exec->e_phnum); > NEW_AUX_ENT(AT_BASE, interp_load_addr); > - NEW_AUX_ENT(AT_FLAGS, 0); > + if (bprm->interp_flags & BINPRM_FLAGS_PRESERVE_ARGV0) > + flags |=3D AT_FLAGS_PRESERVE_ARGV0; > + NEW_AUX_ENT(AT_FLAGS, flags); > NEW_AUX_ENT(AT_ENTRY, exec->e_entry); > NEW_AUX_ENT(AT_UID, from_kuid_munged(cred->user_ns, cred->uid)); > NEW_AUX_ENT(AT_EUID, from_kuid_munged(cred->user_ns, cred->euid))= ; > diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c > index 240f66663543..abb90d82aa58 100644 > --- a/fs/binfmt_elf_fdpic.c > +++ b/fs/binfmt_elf_fdpic.c > @@ -507,6 +507,7 @@ static int create_elf_fdpic_tables(struct linux_binpr= m *bprm, > char __user *u_platform, *u_base_platform, *p; > int loop; > int nr; /* reset for each csp adjustment */ > + unsigned long flags =3D 0; > > #ifdef CONFIG_MMU > /* In some cases (e.g. Hyper-Threading), we want to avoid L1 evic= tions > @@ -647,7 +648,9 @@ static int create_elf_fdpic_tables(struct linux_binpr= m *bprm, > NEW_AUX_ENT(AT_PHENT, sizeof(struct elf_phdr)); > NEW_AUX_ENT(AT_PHNUM, exec_params->hdr.e_phnum); > NEW_AUX_ENT(AT_BASE, interp_params->elfhdr_addr); > - NEW_AUX_ENT(AT_FLAGS, 0); > + if (bprm->interp_flags & BINPRM_FLAGS_PRESERVE_ARGV0) > + flags |=3D AT_FLAGS_PRESERVE_ARGV0; > + NEW_AUX_ENT(AT_FLAGS, flags); > NEW_AUX_ENT(AT_ENTRY, exec_params->entry_addr); > NEW_AUX_ENT(AT_UID, (elf_addr_t) from_kuid_munged(cred->user_= ns, cred->uid)); > NEW_AUX_ENT(AT_EUID, (elf_addr_t) from_kuid_munged(cred->user_= ns, cred->euid)); > diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c > index cdb45829354d..b9acdd26a654 100644 > --- a/fs/binfmt_misc.c > +++ b/fs/binfmt_misc.c > @@ -154,7 +154,9 @@ static int load_misc_binary(struct linux_binprm *bprm= ) > if (bprm->interp_flags & BINPRM_FLAGS_PATH_INACCESSIBLE) > goto ret; > > - if (!(fmt->flags & MISC_FMT_PRESERVE_ARGV0)) { > + if (fmt->flags & MISC_FMT_PRESERVE_ARGV0) { > + bprm->interp_flags |=3D BINPRM_FLAGS_PRESERVE_ARGV0; > + } else { > retval =3D remove_arg_zero(bprm); > if (retval) > goto ret; > diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h > index b40fc633f3be..265b80d5fd6f 100644 > --- a/include/linux/binfmts.h > +++ b/include/linux/binfmts.h > @@ -78,6 +78,10 @@ struct linux_binprm { > #define BINPRM_FLAGS_PATH_INACCESSIBLE_BIT 2 > #define BINPRM_FLAGS_PATH_INACCESSIBLE (1 << BINPRM_FLAGS_PATH_INACCESSI= BLE_BIT) > > +/* if preserve the argv0 for the interpreter */ > +#define BINPRM_FLAGS_PRESERVE_ARGV0_BIT 3 > +#define BINPRM_FLAGS_PRESERVE_ARGV0 (1 << BINPRM_FLAGS_PRESERVE_ARGV0_BI= T) > + > /* Function parameter for binfmt->coredump */ > struct coredump_params { > const kernel_siginfo_t *siginfo; > diff --git a/include/uapi/linux/binfmts.h b/include/uapi/linux/binfmts.h > index 689025d9c185..a70747416130 100644 > --- a/include/uapi/linux/binfmts.h > +++ b/include/uapi/linux/binfmts.h > @@ -18,4 +18,8 @@ struct pt_regs; > /* sizeof(linux_binprm->buf) */ > #define BINPRM_BUF_SIZE 256 > > +/* if preserve the argv0 for the interpreter */ > +#define AT_FLAGS_PRESERVE_ARGV0_BIT 0 > +#define AT_FLAGS_PRESERVE_ARGV0 (1 << AT_FLAGS_PRESERVE_ARGV0_BIT) > + > #endif /* _UAPI_LINUX_BINFMTS_H */ > -- > 2.24.1 >