From: Nicolas Pitre <nicolas.pitre@linaro.org>
To: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: Alexander Viro <viro@zeniv.linux.org.uk>,
David Howells <dhowells@redhat.com>,
Greg Ungerer <gerg@linux-m68k.org>
Subject: [PATCH v2 02/10] elf_fdpic_transfer_args_to_stack(): make it generic
Date: Sun, 17 Jul 2016 23:31:48 -0400 [thread overview]
Message-ID: <1468812716-30537-3-git-send-email-nicolas.pitre@linaro.org> (raw)
In-Reply-To: <1468812716-30537-1-git-send-email-nicolas.pitre@linaro.org>
This copying of arguments and environment is common to both NOMMU
binary formats we support. Let's make the elf_fdpic version available
to the flat format as well.
While at it, improve the code a bit not to copy below the actual
data area.
Signed-off-by: Nicolas Pitre <nico@linaro.org>
---
fs/binfmt_elf_fdpic.c | 38 ++------------------------------------
fs/exec.c | 33 +++++++++++++++++++++++++++++++++
include/linux/binfmts.h | 2 ++
3 files changed, 37 insertions(+), 36 deletions(-)
diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c
index 203589311b..464a972e88 100644
--- a/fs/binfmt_elf_fdpic.c
+++ b/fs/binfmt_elf_fdpic.c
@@ -67,8 +67,6 @@ static int create_elf_fdpic_tables(struct linux_binprm *, struct mm_struct *,
struct elf_fdpic_params *);
#ifndef CONFIG_MMU
-static int elf_fdpic_transfer_args_to_stack(struct linux_binprm *,
- unsigned long *);
static int elf_fdpic_map_file_constdisp_on_uclinux(struct elf_fdpic_params *,
struct file *,
struct mm_struct *);
@@ -515,8 +513,9 @@ static int create_elf_fdpic_tables(struct linux_binprm *bprm,
sp = mm->start_stack;
/* stack the program arguments and environment */
- if (elf_fdpic_transfer_args_to_stack(bprm, &sp) < 0)
+ if (transfer_args_to_stack(bprm, &sp) < 0)
return -EFAULT;
+ sp &= ~15;
#endif
/*
@@ -711,39 +710,6 @@ static int create_elf_fdpic_tables(struct linux_binprm *bprm,
/*****************************************************************************/
/*
- * transfer the program arguments and environment from the holding pages onto
- * the stack
- */
-#ifndef CONFIG_MMU
-static int elf_fdpic_transfer_args_to_stack(struct linux_binprm *bprm,
- unsigned long *_sp)
-{
- unsigned long index, stop, sp;
- char *src;
- int ret = 0;
-
- stop = bprm->p >> PAGE_SHIFT;
- sp = *_sp;
-
- for (index = MAX_ARG_PAGES - 1; index >= stop; index--) {
- src = kmap(bprm->page[index]);
- sp -= PAGE_SIZE;
- if (copy_to_user((void *) sp, src, PAGE_SIZE) != 0)
- ret = -EFAULT;
- kunmap(bprm->page[index]);
- if (ret < 0)
- goto out;
- }
-
- *_sp = (*_sp - (MAX_ARG_PAGES * PAGE_SIZE - bprm->p)) & ~15;
-
-out:
- return ret;
-}
-#endif
-
-/*****************************************************************************/
-/*
* load the appropriate binary image (executable or interpreter) into memory
* - we assume no MMU is available
* - if no other PIC bits are set in params->hdr->e_flags
diff --git a/fs/exec.c b/fs/exec.c
index 887c1c955d..ef0df2f092 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -762,6 +762,39 @@ out_unlock:
}
EXPORT_SYMBOL(setup_arg_pages);
+#else
+
+/*
+ * Transfer the program arguments and environment from the holding pages
+ * onto the stack. The provided stack pointer is adjusted accordingly.
+ */
+int transfer_args_to_stack(struct linux_binprm *bprm,
+ unsigned long *sp_location)
+{
+ unsigned long index, stop, sp;
+ int ret = 0;
+
+ stop = bprm->p >> PAGE_SHIFT;
+ sp = *sp_location;
+
+ for (index = MAX_ARG_PAGES - 1; index >= stop; index--) {
+ unsigned int offset = index == stop ? bprm->p & ~PAGE_MASK : 0;
+ char *src = kmap(bprm->page[index]) + offset;
+ sp -= PAGE_SIZE - offset;
+ if (copy_to_user((void *) sp, src, PAGE_SIZE - offset) != 0)
+ ret = -EFAULT;
+ kunmap(bprm->page[index]);
+ if (ret)
+ goto out;
+ }
+
+ *sp_location = sp;
+
+out:
+ return ret;
+}
+EXPORT_SYMBOL(transfer_args_to_stack);
+
#endif /* CONFIG_MMU */
static struct file *do_open_execat(int fd, struct filename *name, int flags)
diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h
index 314b3caa70..1303b570b1 100644
--- a/include/linux/binfmts.h
+++ b/include/linux/binfmts.h
@@ -113,6 +113,8 @@ extern int suid_dumpable;
extern int setup_arg_pages(struct linux_binprm * bprm,
unsigned long stack_top,
int executable_stack);
+extern int transfer_args_to_stack(struct linux_binprm *bprm,
+ unsigned long *sp_location);
extern int bprm_change_interp(char *interp, struct linux_binprm *bprm);
extern int copy_strings_kernel(int argc, const char *const *argv,
struct linux_binprm *bprm);
--
2.7.4
next prev parent reply other threads:[~2016-07-18 3:31 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-18 3:31 [PULL REQUEST] [PATCH v2 00/10] allow BFLT executables on systems with a MMU Nicolas Pitre
2016-07-18 3:31 ` [PATCH v2 01/10] binfmt_flat: assorted cleanups Nicolas Pitre
2016-07-19 4:52 ` Greg Ungerer
2016-07-19 6:40 ` Geert Uytterhoeven
2016-07-20 4:09 ` Nicolas Pitre
2016-07-20 6:54 ` Geert Uytterhoeven
2016-07-20 7:18 ` Greg Ungerer
2016-07-18 3:31 ` Nicolas Pitre [this message]
2016-07-18 3:31 ` [PATCH v2 03/10] binfmt_flat: use generic transfer_args_to_stack() Nicolas Pitre
2016-07-18 3:31 ` [PATCH v2 04/10] binfmt_flat: clean up create_flat_tables() and stack accesses Nicolas Pitre
2016-07-18 3:31 ` [PATCH v2 05/10] binfmt_flat: use proper user space accessors with relocs processing code Nicolas Pitre
2016-07-18 3:31 ` [PATCH v2 06/10] binfmt_flat: use proper user space accessors with old relocs code Nicolas Pitre
2016-07-18 3:31 ` [PATCH v2 07/10] binfmt_flat: use clear_user() rather than memset() to clear .bss Nicolas Pitre
2016-07-18 3:31 ` [PATCH v2 08/10] binfmt_flat: update libraries' data segment pointer with userspace accessors Nicolas Pitre
2016-07-18 3:31 ` [PATCH v2 09/10] binfmt_flat: add MMU-specific support Nicolas Pitre
2016-07-18 3:31 ` [PATCH v2 10/10] binfmt_flat: allow compressed flat binary format to work on MMU systems Nicolas Pitre
2016-07-18 11:47 ` One Thousand Gnomes
2016-07-18 15:45 ` Nicolas Pitre
2016-07-18 16:51 ` One Thousand Gnomes
2016-07-18 16:58 ` Nicolas Pitre
2016-07-19 7:21 ` [PULL REQUEST] [PATCH v2 00/10] allow BFLT executables on systems with a MMU Greg Ungerer
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=1468812716-30537-3-git-send-email-nicolas.pitre@linaro.org \
--to=nicolas.pitre@linaro.org \
--cc=dhowells@redhat.com \
--cc=gerg@linux-m68k.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
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).