From: Greg Kroah-Hartman Date: Mon, 26 Aug 2024 11:36:54 +0000 (+0200) Subject: 5.10-stable patches X-Git-Tag: v6.1.107~52 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=10323964aee9b38ab66bf23978496fa4ca651595;p=thirdparty%2Fkernel%2Fstable-queue.git 5.10-stable patches added patches: binfmt_misc-pass-binfmt_misc-flags-to-the-interpreter.patch --- diff --git a/queue-5.10/binfmt_misc-pass-binfmt_misc-flags-to-the-interpreter.patch b/queue-5.10/binfmt_misc-pass-binfmt_misc-flags-to-the-interpreter.patch new file mode 100644 index 00000000000..30048371d46 --- /dev/null +++ b/queue-5.10/binfmt_misc-pass-binfmt_misc-flags-to-the-interpreter.patch @@ -0,0 +1,114 @@ +From 2347961b11d4079deace3c81dceed460c08a8fc1 Mon Sep 17 00:00:00 2001 +From: Laurent Vivier +Date: Tue, 28 Jan 2020 14:25:39 +0100 +Subject: binfmt_misc: pass binfmt_misc flags to the interpreter + +From: Laurent Vivier + +commit 2347961b11d4079deace3c81dceed460c08a8fc1 upstream. + +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. + +Note by Helge Deller: +The real-world user of this patch is qemu-user, which needs to know +if it has to preserve the argv[0]. See Debian bug #970460. + +Signed-off-by: Laurent Vivier +Reviewed-by: YunQiang Su +URL: http://bugs.debian.org/970460 +Signed-off-by: Helge Deller +Cc: Thorsten Glaser +Signed-off-by: Greg Kroah-Hartman +--- + 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(-) + +--- a/fs/binfmt_elf.c ++++ b/fs/binfmt_elf.c +@@ -186,6 +186,7 @@ create_elf_tables(struct linux_binprm *b + unsigned char k_rand_bytes[16]; + int items; + elf_addr_t *elf_info; ++ elf_addr_t flags = 0; + int ei_index; + const struct cred *cred = current_cred(); + struct vm_area_struct *vma; +@@ -260,7 +261,9 @@ create_elf_tables(struct linux_binprm *b + 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, 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)); +--- a/fs/binfmt_elf_fdpic.c ++++ b/fs/binfmt_elf_fdpic.c +@@ -506,6 +506,7 @@ static int create_elf_fdpic_tables(struc + 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 +@@ -648,7 +649,9 @@ static int create_elf_fdpic_tables(struc + 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)); +--- a/fs/binfmt_misc.c ++++ b/fs/binfmt_misc.c +@@ -191,7 +191,9 @@ static int load_misc_binary(struct linux + 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; +--- a/include/linux/binfmts.h ++++ b/include/linux/binfmts.h +@@ -73,6 +73,10 @@ struct linux_binprm { + #define BINPRM_FLAGS_PATH_INACCESSIBLE_BIT 2 + #define BINPRM_FLAGS_PATH_INACCESSIBLE (1 << BINPRM_FLAGS_PATH_INACCESSIBLE_BIT) + ++/* preserve 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; +--- 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 + ++/* preserve 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 */ diff --git a/queue-5.10/series b/queue-5.10/series index 2def7b68148..789d9ec83d4 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -107,3 +107,4 @@ drm-msm-dpu-don-t-play-tricks-with-debug-macros.patch drm-msm-dp-reset-the-link-phy-params-before-link-tra.patch mmc-mmc_test-fix-null-dereference-on-allocation-fail.patch bluetooth-mgmt-add-error-handling-to-pair_device.patch +binfmt_misc-pass-binfmt_misc-flags-to-the-interpreter.patch