Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 687fd773 authored by Nicolas Pitre's avatar Nicolas Pitre Committed by Greg Ungerer
Browse files

binfmt_flat: use generic transfer_args_to_stack()



This gets rid of the rather ugly, open coded and suboptimal copy code.

Signed-off-by: default avatarNicolas Pitre <nico@linaro.org>
Reviewed-by: default avatarGreg Ungerer <gerg@linux-m68k.org>
Signed-off-by: default avatarGreg Ungerer <gerg@linux-m68k.org>
parent 7e7ec6a9
Loading
Loading
Loading
Loading
+10 −12
Original line number Diff line number Diff line
@@ -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);