elf_fdpic_transfer_args_to_stack(): make it generic
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> Reviewed-by: Greg Ungerer <gerg@linux-m68k.org> Signed-off-by: Greg Ungerer <gerg@linux-m68k.org>
This commit is contained in:

committed by
Greg Ungerer

parent
c995ee28d2
commit
7e7ec6a934
33
fs/exec.c
33
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)
|
||||
|
Reference in New Issue
Block a user