Module Name: src Committed By: maxv Date: Sat Mar 22 07:27:22 UTC 2014
Modified Files: src/sys/kern: exec_elf.c Log Message: Small changes: - rename elf_load_file() to elf_load_interp() - use the correct type for 'nused' - remove useless cases - reorder a kmem_alloc ok christos@ To generate a diff of this commit: cvs rdiff -u -r1.64 -r1.65 src/sys/kern/exec_elf.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/exec_elf.c diff -u src/sys/kern/exec_elf.c:1.64 src/sys/kern/exec_elf.c:1.65 --- src/sys/kern/exec_elf.c:1.64 Sun Mar 16 07:57:25 2014 +++ src/sys/kern/exec_elf.c Sat Mar 22 07:27:21 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: exec_elf.c,v 1.64 2014/03/16 07:57:25 maxv Exp $ */ +/* $NetBSD: exec_elf.c,v 1.65 2014/03/22 07:27:21 maxv Exp $ */ /*- * Copyright (c) 1994, 2000, 2005 The NetBSD Foundation, Inc. @@ -57,7 +57,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: exec_elf.c,v 1.64 2014/03/16 07:57:25 maxv Exp $"); +__KERNEL_RCSID(1, "$NetBSD: exec_elf.c,v 1.65 2014/03/22 07:27:21 maxv Exp $"); #ifdef _KERNEL_OPT #include "opt_pax.h" @@ -90,7 +90,7 @@ extern struct emul emul_netbsd; #define elf_check_header ELFNAME(check_header) #define elf_copyargs ELFNAME(copyargs) -#define elf_load_file ELFNAME(load_file) +#define elf_load_interp ELFNAME(load_interp) #define elf_load_psection ELFNAME(load_psection) #define exec_elf_makecmds ELFNAME2(exec,makecmds) #define netbsd_elf_signature ELFNAME2(netbsd,signature) @@ -99,7 +99,7 @@ extern struct emul emul_netbsd; #define elf_free_emul_arg ELFNAME(free_emul_arg) static int -elf_load_file(struct lwp *, struct exec_package *, char *, +elf_load_interp(struct lwp *, struct exec_package *, char *, struct exec_vmcmd_set *, u_long *, Elf_Addr *); static void elf_load_psection(struct exec_vmcmd_set *, struct vnode *, const Elf_Phdr *, @@ -396,14 +396,12 @@ elf_load_psection(struct exec_vmcmd_set } /* - * elf_load_file(): + * elf_load_interp(): * - * Load a file (interpreter/library) pointed to by path - * [stolen from coff_load_shlib()]. Made slightly generic - * so it might be used externally. + * Load an interpreter pointed to by path. */ static int -elf_load_file(struct lwp *l, struct exec_package *epp, char *path, +elf_load_interp(struct lwp *l, struct exec_package *epp, char *path, struct exec_vmcmd_set *vcset, u_long *entryoff, Elf_Addr *last) { int error, i; @@ -610,11 +608,6 @@ elf_load_file(struct lwp *l, struct exec break; } - case PT_DYNAMIC: - case PT_PHDR: - case PT_NOTE: - break; - default: break; } @@ -659,7 +652,7 @@ exec_elf_makecmds(struct lwp *l, struct int error, i; char *interp = NULL; u_long phsize; - struct elf_args *ap = NULL; + struct elf_args *ap; bool is_dyn = false; if (epp->ep_hdrvalid < sizeof(Elf_Ehdr)) @@ -781,7 +774,6 @@ exec_elf_makecmds(struct lwp *l, struct case PT_INTERP: /* Already did this one. */ case PT_DYNAMIC: - break; case PT_NOTE: break; case PT_PHDR: @@ -804,11 +796,6 @@ exec_elf_makecmds(struct lwp *l, struct goto bad; } - if (interp || (epp->ep_flags & EXEC_FORCEAUX) != 0) { - ap = kmem_alloc(sizeof(*ap), KM_SLEEP); - ap->arg_interp = (vaddr_t)NULL; - } - if (epp->ep_daddr == ELFDEFNNAME(NO_ADDR)) { epp->ep_daddr = round_page(end_text); epp->ep_dsize = 0; @@ -819,27 +806,32 @@ exec_elf_makecmds(struct lwp *l, struct * its interpreter */ if (interp) { - int nused = epp->ep_vmcmds.evs_used; + u_int nused = epp->ep_vmcmds.evs_used; u_long interp_offset = 0; - if ((error = elf_load_file(l, epp, interp, + if ((error = elf_load_interp(l, epp, interp, &epp->ep_vmcmds, &interp_offset, &pos)) != 0) { - kmem_free(ap, sizeof(*ap)); goto bad; } if (epp->ep_vmcmds.evs_used == nused) { - /* elf_load_file() has not set up any new VMCMD */ - kmem_free(ap, sizeof(*ap)); + /* elf_load_interp() has not set up any new VMCMD */ error = ENOEXEC; goto bad; } + ap = kmem_alloc(sizeof(*ap), KM_SLEEP); ap->arg_interp = epp->ep_vmcmds.evs_cmds[nused].ev_addr; epp->ep_entryoffset = interp_offset; epp->ep_entry = ap->arg_interp + interp_offset; PNBUF_PUT(interp); - } else + } else { epp->ep_entry = eh->e_entry; + if (epp->ep_flags & EXEC_FORCEAUX) { + ap = kmem_alloc(sizeof(*ap), KM_SLEEP); + ap->arg_interp = (vaddr_t)NULL; + } else + ap = NULL; + } if (ap) { ap->arg_phaddr = phdr ? phdr : computed_phdr;