diff options
Diffstat (limited to 'linux-user/linuxload.c')
-rw-r--r-- | linux-user/linuxload.c | 48 |
1 files changed, 33 insertions, 15 deletions
diff --git a/linux-user/linuxload.c b/linux-user/linuxload.c index 0efbb76ce..ada7c697d 100644 --- a/linux-user/linuxload.c +++ b/linux-user/linuxload.c @@ -13,14 +13,17 @@ #define NGROUPS 32 /* ??? This should really be somewhere else. */ -void memcpy_to_target(target_ulong dest, const void *src, - unsigned long len) +abi_long memcpy_to_target(abi_ulong dest, const void *src, + unsigned long len) { void *host_ptr; - host_ptr = lock_user(dest, len, 0); + host_ptr = lock_user(VERIFY_WRITE, dest, len, 0); + if (!host_ptr) + return -TARGET_EFAULT; memcpy(host_ptr, src, len); unlock_user(host_ptr, dest, 1); + return 0; } static int in_group_p(gid_t g) @@ -109,33 +112,44 @@ static int prepare_binprm(struct linux_binprm *bprm) } /* Construct the envp and argv tables on the target stack. */ -target_ulong loader_build_argptr(int envc, int argc, target_ulong sp, - target_ulong stringp, int push_ptr) +abi_ulong loader_build_argptr(int envc, int argc, abi_ulong sp, + abi_ulong stringp, int push_ptr) { - int n = sizeof(target_ulong); - target_ulong envp; - target_ulong argv; + int n = sizeof(abi_ulong); + abi_ulong envp; + abi_ulong argv; sp -= (envc + 1) * n; envp = sp; sp -= (argc + 1) * n; argv = sp; if (push_ptr) { - sp -= n; tputl(sp, envp); - sp -= n; tputl(sp, argv); + /* FIXME - handle put_user() failures */ + sp -= n; + put_user_ual(envp, sp); + sp -= n; + put_user_ual(argv, sp); } - sp -= n; tputl(sp, argc); + sp -= n; + /* FIXME - handle put_user() failures */ + put_user_ual(argc, sp); while (argc-- > 0) { - tputl(argv, stringp); argv += n; + /* FIXME - handle put_user() failures */ + put_user_ual(stringp, argv); + argv += n; stringp += target_strlen(stringp) + 1; } - tputl(argv, 0); + /* FIXME - handle put_user() failures */ + put_user_ual(0, argv); while (envc-- > 0) { - tputl(envp, stringp); envp += n; + /* FIXME - handle put_user() failures */ + put_user_ual(stringp, envp); + envp += n; stringp += target_strlen(stringp) + 1; } - tputl(envp, 0); + /* FIXME - handle put_user() failures */ + put_user_ual(0, envp); return sp; } @@ -169,7 +183,11 @@ int loader_exec(const char * filename, char ** argv, char ** envp, && bprm.buf[1] == 'E' && bprm.buf[2] == 'L' && bprm.buf[3] == 'F') { +#ifndef TARGET_HAS_ELFLOAD32 retval = load_elf_binary(&bprm,regs,infop); +#else + retval = load_elf_binary_multi(&bprm, regs, infop); +#endif #if defined(TARGET_HAS_BFLT) } else if (bprm.buf[0] == 'b' && bprm.buf[1] == 'F' |