Module Name: src Committed By: mrg Date: Mon Dec 14 07:13:31 UTC 2009
Modified Files: src/sys/arch/mips/mips [matt-nb5-mips64]: cpu_exec.c src/sys/compat/common [matt-nb5-mips64]: compat_util.c compat_util.h src/sys/compat/netbsd32 [matt-nb5-mips64]: netbsd32_exec_elf32.c Log Message: pullup from -current: >replace mips:elf_check_itp() and ELFNAME2(netbsd32,probe_noteless) that >it's based upon with a common compat_elf_check_interp(). > >tested on MALTA64 and sparc64. To generate a diff of this commit: cvs rdiff -u -r1.50.54.1.4.10 -r1.50.54.1.4.11 \ src/sys/arch/mips/mips/cpu_exec.c cvs rdiff -u -r1.41 -r1.41.18.1 src/sys/compat/common/compat_util.c cvs rdiff -u -r1.20 -r1.20.14.1 src/sys/compat/common/compat_util.h cvs rdiff -u -r1.29.14.1 -r1.29.14.2 \ src/sys/compat/netbsd32/netbsd32_exec_elf32.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/arch/mips/mips/cpu_exec.c diff -u src/sys/arch/mips/mips/cpu_exec.c:1.50.54.1.4.10 src/sys/arch/mips/mips/cpu_exec.c:1.50.54.1.4.11 --- src/sys/arch/mips/mips/cpu_exec.c:1.50.54.1.4.10 Tue Dec 8 02:21:16 2009 +++ src/sys/arch/mips/mips/cpu_exec.c Mon Dec 14 07:13:31 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu_exec.c,v 1.50.54.1.4.10 2009/12/08 02:21:16 mrg Exp $ */ +/* $NetBSD: cpu_exec.c,v 1.50.54.1.4.11 2009/12/14 07:13:31 mrg Exp $ */ /* * Copyright (c) 1992, 1993 @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cpu_exec.c,v 1.50.54.1.4.10 2009/12/08 02:21:16 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cpu_exec.c,v 1.50.54.1.4.11 2009/12/14 07:13:31 mrg Exp $"); #include "opt_compat_netbsd.h" #include "opt_compat_ultrix.h" @@ -62,6 +62,8 @@ #include <machine/reg.h> #include <mips/regnum.h> /* symbolic register indices */ +#include <compat/common/compat_util.h> + int mips_elf_makecmds(struct lwp *, struct exec_package *); @@ -310,42 +312,6 @@ return 0; } -static int -elf_check_itp(struct exec_package *epp, const char *itp, - const char *itp_suffix) -{ - if (itp) { - /* - * If the path is exactly "/usr/libexec/ld.elf_so", first - * try to see if "/usr/libexec/ld.elf_so-<abi>" exists - * and if so, use that instead. - * XXX maybe move this into compat/common - */ - if (strcmp(itp, "/usr/libexec/ld.elf_so") == 0 || - strcmp(itp, "/libexec/ld.elf_so") == 0) { - struct nameidata nd; - char *path; - int error; - - path = PNBUF_GET(); - snprintf(path, MAXPATHLEN, "%s-%s", itp, itp_suffix); - NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, path); - error = namei(&nd); - /* - * If that worked, replace interpreter in case we - * actually need to load it - */ - if (error == 0) { - if (epp->ep_interp != NULL) - vrele(epp->ep_interp); - epp->ep_interp = nd.ni_vp; - } - PNBUF_PUT(path); - } - } - return 0; -} - #if EXEC_ELF32 int mips_netbsd_elf32_probe(struct lwp *l, struct exec_package *epp, void *eh0, @@ -407,7 +373,8 @@ return ENOEXEC; } - return elf_check_itp(epp, itp, itp_suffix); + (void)compat_elf_check_interp(epp, itp, itp_suffix); + return 0; } void @@ -500,7 +467,8 @@ return ENOEXEC; } - return elf_check_itp(epp, itp, itp_suffix); + (void)compat_elf_check_interp(epp, itp, itp_suffix); + return 0; } void Index: src/sys/compat/common/compat_util.c diff -u src/sys/compat/common/compat_util.c:1.41 src/sys/compat/common/compat_util.c:1.41.18.1 --- src/sys/compat/common/compat_util.c:1.41 Mon Apr 28 20:23:41 2008 +++ src/sys/compat/common/compat_util.c Mon Dec 14 07:13:31 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: compat_util.c,v 1.41 2008/04/28 20:23:41 martin Exp $ */ +/* $NetBSD: compat_util.c,v 1.41.18.1 2009/12/14 07:13:31 mrg Exp $ */ /*- * Copyright (c) 1994 The NetBSD Foundation, Inc. @@ -29,8 +29,36 @@ * POSSIBILITY OF SUCH DAMAGE. */ +/* + * Copyright (c) 2008, 2009 Matthew R. Green + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: compat_util.c,v 1.41 2008/04/28 20:23:41 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: compat_util.c,v 1.41.18.1 2009/12/14 07:13:31 mrg Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -148,3 +176,49 @@ msg, mp->mnt_stat.f_mntonname, mp->mnt_stat.f_mntfromname); uprintf("%s: dir offset too large for emulated program\n", msg); } + +/* + * Look for native NetBSD compatibility libraries, usually interp-ABI. + * It returns 0 if it changed the interpreter, otherwise it returns + * the error from namei(). Callers should not try any more processing + * if this returns 0. + */ +int +compat_elf_check_interp(struct exec_package *epp, + char *interp, + const char *interp_suffix) +{ + int error = 0; + + /* + * Don't look for something else, if someone has already found and + * setup the ep_interp already. + */ + if (interp && epp->ep_interp == NULL) { + /* + * If the path is exactly "/usr/libexec/ld.elf_so", first + * try to see if "/usr/libexec/ld.elf_so-<abi>" exists + * and if so, use that instead. + */ + if (strcmp(interp, "/usr/libexec/ld.elf_so") == 0 || + strcmp(interp, "/libexec/ld.elf_so") == 0) { + struct nameidata nd; + char *path; + + path = PNBUF_GET(); + snprintf(path, MAXPATHLEN, "%s-%s", interp, interp_suffix); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, path); + error = namei(&nd); + /* + * If that worked, replace interpreter in case we + * actually need to load it + */ + if (error == 0) { + epp->ep_interp = nd.ni_vp; + snprintf(interp, MAXPATHLEN, "%s", path); + } + PNBUF_PUT(path); + } + } + return error; +} Index: src/sys/compat/common/compat_util.h diff -u src/sys/compat/common/compat_util.h:1.20 src/sys/compat/common/compat_util.h:1.20.14.1 --- src/sys/compat/common/compat_util.h:1.20 Mon Apr 28 20:23:41 2008 +++ src/sys/compat/common/compat_util.h Mon Dec 14 07:13:31 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: compat_util.h,v 1.20 2008/04/28 20:23:41 martin Exp $ */ +/* $NetBSD: compat_util.h,v 1.20.14.1 2009/12/14 07:13:31 mrg Exp $ */ /*- * Copyright (c) 1994 The NetBSD Foundation, Inc. @@ -31,6 +31,7 @@ /* * Copyright (c) 1995 Frank van der Linden + * Copyright (c) 2009 Matthew R. Green * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -79,4 +80,6 @@ void compat_offseterr(struct vnode *, const char *); +int compat_elf_check_interp(struct exec_package *, char *, const char *); + #endif /* !_COMPAT_UTIL_H_ */ Index: src/sys/compat/netbsd32/netbsd32_exec_elf32.c diff -u src/sys/compat/netbsd32/netbsd32_exec_elf32.c:1.29.14.1 src/sys/compat/netbsd32/netbsd32_exec_elf32.c:1.29.14.2 --- src/sys/compat/netbsd32/netbsd32_exec_elf32.c:1.29.14.1 Sat Sep 12 17:45:08 2009 +++ src/sys/compat/netbsd32/netbsd32_exec_elf32.c Mon Dec 14 07:13:31 2009 @@ -1,8 +1,8 @@ -/* $NetBSD: netbsd32_exec_elf32.c,v 1.29.14.1 2009/09/12 17:45:08 matt Exp $ */ +/* $NetBSD: netbsd32_exec_elf32.c,v 1.29.14.2 2009/12/14 07:13:31 mrg Exp $ */ /* from: NetBSD: exec_aout.c,v 1.15 1996/09/26 23:34:46 cgd Exp */ /* - * Copyright (c) 1998, 2001 Matthew R. Green. + * Copyright (c) 1998, 2001, 2008 Matthew R. Green. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -57,7 +57,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: netbsd32_exec_elf32.c,v 1.29.14.1 2009/09/12 17:45:08 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: netbsd32_exec_elf32.c,v 1.29.14.2 2009/12/14 07:13:31 mrg Exp $"); #define ELFSIZE 32 @@ -74,6 +74,8 @@ #include <sys/kauth.h> #include <sys/namei.h> +#include <compat/common/compat_util.h> + #include <compat/netbsd32/netbsd32.h> #include <compat/netbsd32/netbsd32_exec.h> @@ -109,43 +111,11 @@ ELFNAME2(netbsd32,probe_noteless)(struct lwp *l, struct exec_package *epp, void *eh, char *itp, vaddr_t *pos) { - int error; - if (itp) { - /* - * If the path is exactly "/usr/libexec/ld.elf_so", first - * try to see if "/usr/libexec/ld.elf_so-<arch>" exists - * and if so, use that instead. - * XXX maybe move this into compat/common - */ - error = 0; - if (strcmp(itp, "/usr/libexec/ld.elf_so") == 0 || - strcmp(itp, "/libexec/ld.elf_so") == 0) { - extern const char machine32[]; - struct nameidata nd; - char *path; - - if (epp->ep_interp != NULL) - vrele(epp->ep_interp); - - path = PNBUF_GET(); - snprintf(path, MAXPATHLEN, "%s-%s", itp, machine32); - NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, path); - error = namei(&nd); - /* - * If that worked, save interpreter in case we - * actually need to load it - */ - if (error != 0) - epp->ep_interp = NULL; - else - epp->ep_interp = nd.ni_vp; - PNBUF_PUT(path); - } - - /* Translate interpreter name if needed */ - if (error && (error = emul_find_interp(l, epp, itp)) != 0) - return error; + if (itp && epp->ep_interp == NULL) { + extern const char machine32[]; + (void)compat_elf_check_interp(epp, itp, machine32); + } epp->ep_flags |= EXEC_32; epp->ep_vm_minaddr = VM_MIN_ADDRESS;