Module Name: src Committed By: maxv Date: Sat Feb 15 16:17:01 UTC 2014
Modified Files: src/sys/kern: exec_elf.c src/sys/sys: exec_elf.h Log Message: Remove the last argument of elf_check_header(). It is easier - and faster - to check the e_type field in the calling function. Other BSD's already do this. ok christos@ To generate a diff of this commit: cvs rdiff -u -r1.55 -r1.56 src/sys/kern/exec_elf.c cvs rdiff -u -r1.138 -r1.139 src/sys/sys/exec_elf.h 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.55 src/sys/kern/exec_elf.c:1.56 --- src/sys/kern/exec_elf.c:1.55 Fri Feb 14 07:30:07 2014 +++ src/sys/kern/exec_elf.c Sat Feb 15 16:17:01 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: exec_elf.c,v 1.55 2014/02/14 07:30:07 maxv Exp $ */ +/* $NetBSD: exec_elf.c,v 1.56 2014/02/15 16:17:01 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.55 2014/02/14 07:30:07 maxv Exp $"); +__KERNEL_RCSID(1, "$NetBSD: exec_elf.c,v 1.56 2014/02/15 16:17:01 maxv Exp $"); #ifdef _KERNEL_OPT #include "opt_pax.h" @@ -283,7 +283,7 @@ elf_copyargs(struct lwp *l, struct exec_ * Check header for validity; return 0 if ok, ENOEXEC if error */ int -elf_check_header(Elf_Ehdr *eh, int type) +elf_check_header(Elf_Ehdr *eh) { if (memcmp(eh->e_ident, ELFMAG, SELFMAG) != 0 || @@ -301,9 +301,6 @@ elf_check_header(Elf_Ehdr *eh, int type) if (ELF_EHDR_FLAGS_OK(eh) == 0) return ENOEXEC; - if (eh->e_type != type) - return ENOEXEC; - if (eh->e_shnum > MAXSHNUM || eh->e_phnum > MAXPHNUM) return ENOEXEC; @@ -491,10 +488,9 @@ elf_load_file(struct lwp *l, struct exec if ((error = exec_read_from(l, vp, 0, &eh, sizeof(eh))) != 0) goto bad; - if ((error = elf_check_header(&eh, ET_DYN)) != 0) + if ((error = elf_check_header(&eh)) != 0) goto bad; - - if (eh.e_phnum == 0) { + if (eh.e_type != ET_DYN || eh.e_phnum == 0) { error = ENOEXEC; goto bad; } @@ -667,17 +663,20 @@ exec_elf_makecmds(struct lwp *l, struct char *interp = NULL; u_long phsize; struct elf_args *ap = NULL; - bool is_dyn; + bool is_dyn = false; if (epp->ep_hdrvalid < sizeof(Elf_Ehdr)) return ENOEXEC; + if ((error = elf_check_header(eh)) != 0) + return error; - is_dyn = elf_check_header(eh, ET_DYN) == 0; - /* - * XXX allow for executing shared objects. It seems silly - * but other ELF-based systems allow it as well. - */ - if (!is_dyn && elf_check_header(eh, ET_EXEC) != 0) + if (eh->e_type == ET_DYN) + /* + * XXX allow for executing shared objects. It seems silly + * but other ELF-based systems allow it as well. + */ + is_dyn = true; + else if (eh->e_type != ET_EXEC) return ENOEXEC; if (eh->e_phnum == 0) Index: src/sys/sys/exec_elf.h diff -u src/sys/sys/exec_elf.h:1.138 src/sys/sys/exec_elf.h:1.139 --- src/sys/sys/exec_elf.h:1.138 Tue Feb 11 09:04:28 2014 +++ src/sys/sys/exec_elf.h Sat Feb 15 16:17:01 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: exec_elf.h,v 1.138 2014/02/11 09:04:28 skrll Exp $ */ +/* $NetBSD: exec_elf.h,v 1.139 2014/02/15 16:17:01 maxv Exp $ */ /*- * Copyright (c) 1994 The NetBSD Foundation, Inc. @@ -1261,7 +1261,7 @@ int coredump_elf32(struct lwp *, struct void coredump_savenote_elf32(struct note_state *, unsigned int, const char *, void *, size_t); -int elf32_check_header(Elf32_Ehdr *, int); +int elf32_check_header(Elf32_Ehdr *); #endif #ifdef EXEC_ELF64 @@ -1273,7 +1273,7 @@ int coredump_elf64(struct lwp *, struct void coredump_savenote_elf64(struct note_state *, unsigned int, const char *, void *, size_t); -int elf64_check_header(Elf64_Ehdr *, int); +int elf64_check_header(Elf64_Ehdr *); #endif #endif /* _KERNEL */