diff options
author | jhb <jhb@FreeBSD.org> | 2003-03-21 19:49:34 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2003-03-21 19:49:34 +0000 |
commit | 38bdc5fff0d6cc0edd89dcfd2a0e6c5388c6a00a (patch) | |
tree | 43550d8fe91a41ee3225185c991b731b4201205e /sys/alpha | |
parent | cda1ad1e064fd4783b1518baa707b19bd947e746 (diff) | |
download | FreeBSD-src-38bdc5fff0d6cc0edd89dcfd2a0e6c5388c6a00a.zip FreeBSD-src-38bdc5fff0d6cc0edd89dcfd2a0e6c5388c6a00a.tar.gz |
Sync up linux and svr compat elf fixup functions for exec(). These
functions are now all basically identical except that alpha linux uses
Elf64 arguments and svr4 and i386 linux use Elf32. The fixups include
changing the first argument to be a register_t ** to match the prototype
for fixup functions, asserting that the process in the image_params struct
is always curproc and removing unnecessary locking to read credentials as a
result, and a few style fixes.
Diffstat (limited to 'sys/alpha')
-rw-r--r-- | sys/alpha/linux/linux_sysvec.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/sys/alpha/linux/linux_sysvec.c b/sys/alpha/linux/linux_sysvec.c index 9e9e1f9..40deced 100644 --- a/sys/alpha/linux/linux_sysvec.c +++ b/sys/alpha/linux/linux_sysvec.c @@ -81,25 +81,26 @@ SET_DECLARE(linux_ioctl_handler_set, struct linux_ioctl_handler); void osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code); -static int elf_linux_fixup(long **stack_base, +static int elf_linux_fixup(register_t **stack_base, struct image_params *iparams); static int exec_linux_imgact_try(struct image_params *iparams); static int -elf_linux_fixup(long **stack_base, struct image_params *imgp) +elf_linux_fixup(register_t **stack_base, struct image_params *imgp) { - long *pos; Elf64_Auxargs *args; + register_t *pos; + KASSERT(curthread->td_proc == imgp->proc && + (curthread->td_proc->p_flag & P_THREADED) == 0, + ("unsafe elf_linux_fixup(), should be curproc")); args = (Elf64_Auxargs *)imgp->auxargs; pos = *stack_base + (imgp->argc + imgp->envc + 2); - if (args->trace) { + if (args->trace) AUXARGS_ENTRY(pos, AT_DEBUG, 1); - } - if (args->execfd != -1) { + if (args->execfd != -1) AUXARGS_ENTRY(pos, AT_EXECFD, args->execfd); - } AUXARGS_ENTRY(pos, AT_PHDR, args->phdr); AUXARGS_ENTRY(pos, AT_PHENT, args->phent); AUXARGS_ENTRY(pos, AT_PHNUM, args->phnum); @@ -107,19 +108,17 @@ elf_linux_fixup(long **stack_base, struct image_params *imgp) AUXARGS_ENTRY(pos, AT_FLAGS, args->flags); AUXARGS_ENTRY(pos, AT_ENTRY, args->entry); AUXARGS_ENTRY(pos, AT_BASE, args->base); - PROC_LOCK(imgp->proc); AUXARGS_ENTRY(pos, AT_UID, imgp->proc->p_ucred->cr_ruid); AUXARGS_ENTRY(pos, AT_EUID, imgp->proc->p_ucred->cr_svuid); AUXARGS_ENTRY(pos, AT_GID, imgp->proc->p_ucred->cr_rgid); AUXARGS_ENTRY(pos, AT_EGID, imgp->proc->p_ucred->cr_svgid); - PROC_UNLOCK(imgp->proc); AUXARGS_ENTRY(pos, AT_NULL, 0); free(imgp->auxargs, M_TEMP); imgp->auxargs = NULL; (*stack_base)--; - **stack_base = (long)imgp->argc; + **stack_base = (register_t)imgp->argc; return 0; } |