summaryrefslogtreecommitdiffstats
path: root/sys/alpha
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2003-03-21 19:49:34 +0000
committerjhb <jhb@FreeBSD.org>2003-03-21 19:49:34 +0000
commit38bdc5fff0d6cc0edd89dcfd2a0e6c5388c6a00a (patch)
tree43550d8fe91a41ee3225185c991b731b4201205e /sys/alpha
parentcda1ad1e064fd4783b1518baa707b19bd947e746 (diff)
downloadFreeBSD-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.c19
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;
}
OpenPOWER on IntegriCloud