binfmt_flat: use generic transfer_args_to_stack()
authorNicolas Pitre <nicolas.pitre@linaro.org>
Sun, 24 Jul 2016 15:30:19 +0000 (11:30 -0400)
committerGreg Ungerer <gerg@linux-m68k.org>
Mon, 25 Jul 2016 06:51:55 +0000 (16:51 +1000)
This gets rid of the rather ugly, open coded and suboptimal copy code.

Signed-off-by: Nicolas Pitre <nico@linaro.org>
Reviewed-by: Greg Ungerer <gerg@linux-m68k.org>
Signed-off-by: Greg Ungerer <gerg@linux-m68k.org>
fs/binfmt_flat.c

index 03301bad1f9b09588aa5b3f8990e9511b01e5ba1..a002e1a3b9e8f08dce412a12c693d521d2d5010c 100644 (file)
@@ -846,10 +846,8 @@ static int load_flat_binary(struct linux_binprm *bprm)
 {
        struct lib_info libinfo;
        struct pt_regs *regs = current_pt_regs();
-       unsigned long p = bprm->p;
-       unsigned long stack_len;
+       unsigned long sp, stack_len;
        unsigned long start_addr;
-       unsigned long *sp;
        int res;
        int i, j;
 
@@ -884,15 +882,15 @@ static int load_flat_binary(struct linux_binprm *bprm)
 
        set_binfmt(&flat_format);
 
-       p = ((current->mm->context.end_brk + stack_len + 3) & ~3) - 4;
-       pr_debug("p=%lx\n", p);
+       sp = ((current->mm->context.end_brk + stack_len + 3) & ~3) - 4;
+       pr_debug("sp=%lx\n", sp);
 
-       /* copy the arg pages onto the stack, this could be more efficient :-) */
-       for (i = TOP_OF_ARGS - 1; i >= bprm->p; i--)
-               *(char *) --p =
-                       ((char *) page_address(bprm->page[i/PAGE_SIZE]))[i % PAGE_SIZE];
+       /* copy the arg pages onto the stack */
+       res = transfer_args_to_stack(bprm, &sp);
+       if (res)
+               return res;
 
-       sp = (unsigned long *) create_flat_tables(p, bprm);
+       sp = create_flat_tables(sp, bprm);
 
        /* Fake some return addresses to ensure the call chain will
         * initialise library in order for us.  We are required to call
@@ -904,14 +902,14 @@ static int load_flat_binary(struct linux_binprm *bprm)
        for (i = MAX_SHARED_LIBS-1; i > 0; i--) {
                if (libinfo.lib_list[i].loaded) {
                        /* Push previos first to call address */
-                       --sp;   put_user(start_addr, sp);
+                       --sp;   put_user(start_addr, (unsigned long *)sp);
                        start_addr = libinfo.lib_list[i].entry;
                }
        }
 #endif
 
        /* Stash our initial stack pointer into the mm structure */
-       current->mm->start_stack = (unsigned long)sp;
+       current->mm->start_stack = sp;
 
 #ifdef FLAT_PLAT_INIT
        FLAT_PLAT_INIT(regs);