diff options
Diffstat (limited to 'sys/i386/linux/linux_sysvec.c')
-rw-r--r-- | sys/i386/linux/linux_sysvec.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/sys/i386/linux/linux_sysvec.c b/sys/i386/linux/linux_sysvec.c index 407348d..c324f82 100644 --- a/sys/i386/linux/linux_sysvec.c +++ b/sys/i386/linux/linux_sysvec.c @@ -228,9 +228,13 @@ linux_fixup(register_t **stack_base, struct image_params *imgp) static int elf_linux_fixup(register_t **stack_base, struct image_params *imgp) { - Elf32_Auxargs *args = (Elf32_Auxargs *)imgp->auxargs; + Elf32_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 = (Elf32_Auxargs *)imgp->auxargs; pos = *stack_base + (imgp->argc + imgp->envc + 2); if (args->trace) @@ -244,19 +248,17 @@ elf_linux_fixup(register_t **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; } |