From: YunQiang Su <syq@debian.org> To: Laurent Vivier <laurent@vivier.eu> Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Alexander Viro <viro@zeniv.linux.org.uk>, James Bottomley <James.Bottomley@hansenpartnership.com>, libc-alpha@sourceware.org, linux-arch@vger.kernel.org, linux-api@vger.kernel.org Subject: Re: [PATCH v3] binfmt_misc: pass binfmt_misc flags to the interpreter Date: Sun, 1 Mar 2020 08:47:23 +0800 Message-ID: <CAKcpw6W8_a3LPMPTph1asU3dCfjXk-xh5_7+MCEFicwTph+EKg@mail.gmail.com> (raw) In-Reply-To: <20200128132539.782286-1-laurent@vivier.eu> Laurent Vivier <laurent@vivier.eu> 于2020年1月28日周二 下午9:25写道: > > 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 <laurent@vivier.eu> > --- > > 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 elfhdr *exec, > unsigned char k_rand_bytes[16]; > int items; > elf_addr_t *elf_info; > + elf_addr_t flags = 0; > int ei_index = 0; > const struct cred *cred = current_cred(); > struct vm_area_struct *vma; > @@ -250,7 +251,9 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *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 |= 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_binprm *bprm, > char __user *u_platform, *u_base_platform, *p; > int loop; > int nr; /* reset for each csp adjustment */ > + unsigned long flags = 0; > > #ifdef CONFIG_MMU > /* In some cases (e.g. Hyper-Threading), we want to avoid L1 evictions > @@ -647,7 +648,9 @@ static int create_elf_fdpic_tables(struct linux_binprm *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 |= 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 |= BINPRM_FLAGS_PRESERVE_ARGV0; > + } else { > retval = 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_INACCESSIBLE_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_BIT) > + > /* 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 >
next prev parent reply index Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-01-28 13:25 Laurent Vivier 2020-02-02 12:15 ` [EXTERNAL][PATCH " YunQiang Su 2020-02-14 12:29 ` [PATCH " Laurent Vivier 2020-02-20 10:07 ` Laurent Vivier 2020-02-27 7:27 ` YunQiang Su 2020-03-01 0:47 ` YunQiang Su [this message] 2020-06-05 16:20 ` Laurent Vivier 2021-02-13 7:40 ` Helge Deller 2021-02-23 5:35 ` YunQiang Su
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=CAKcpw6W8_a3LPMPTph1asU3dCfjXk-xh5_7+MCEFicwTph+EKg@mail.gmail.com \ --to=syq@debian.org \ --cc=James.Bottomley@hansenpartnership.com \ --cc=laurent@vivier.eu \ --cc=libc-alpha@sourceware.org \ --cc=linux-api@vger.kernel.org \ --cc=linux-arch@vger.kernel.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=viro@zeniv.linux.org.uk \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Linux-Fsdevel Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/linux-fsdevel/0 linux-fsdevel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 linux-fsdevel linux-fsdevel/ https://lore.kernel.org/linux-fsdevel \ linux-fsdevel@vger.kernel.org public-inbox-index linux-fsdevel Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/org.kernel.vger.linux-fsdevel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git