| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: exec_elf.c,v 1.69.2.2 2015/03/29 09:07:55 martin Exp $ */ | | 1 | /* $NetBSD: exec_elf.c,v 1.69.2.3 2015/11/08 00:57:09 riz Exp $ */ |
2 | | | 2 | |
3 | /*- | | 3 | /*- |
4 | * Copyright (c) 1994, 2000, 2005 The NetBSD Foundation, Inc. | | 4 | * Copyright (c) 1994, 2000, 2005 The NetBSD Foundation, Inc. |
5 | * All rights reserved. | | 5 | * All rights reserved. |
6 | * | | 6 | * |
7 | * This code is derived from software contributed to The NetBSD Foundation | | 7 | * This code is derived from software contributed to The NetBSD Foundation |
8 | * by Christos Zoulas. | | 8 | * by Christos Zoulas. |
9 | * | | 9 | * |
10 | * Redistribution and use in source and binary forms, with or without | | 10 | * Redistribution and use in source and binary forms, with or without |
11 | * modification, are permitted provided that the following conditions | | 11 | * modification, are permitted provided that the following conditions |
12 | * are met: | | 12 | * are met: |
13 | * 1. Redistributions of source code must retain the above copyright | | 13 | * 1. Redistributions of source code must retain the above copyright |
14 | * notice, this list of conditions and the following disclaimer. | | 14 | * notice, this list of conditions and the following disclaimer. |
| @@ -47,27 +47,27 @@ | | | @@ -47,27 +47,27 @@ |
47 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | | 47 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
48 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | | 48 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
49 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | | 49 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
50 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | | 50 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
51 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | | 51 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
52 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | | 52 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
53 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | | 53 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
54 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | | 54 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
55 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | | 55 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
56 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | | 56 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
57 | */ | | 57 | */ |
58 | | | 58 | |
59 | #include <sys/cdefs.h> | | 59 | #include <sys/cdefs.h> |
60 | __KERNEL_RCSID(1, "$NetBSD: exec_elf.c,v 1.69.2.2 2015/03/29 09:07:55 martin Exp $"); | | 60 | __KERNEL_RCSID(1, "$NetBSD: exec_elf.c,v 1.69.2.3 2015/11/08 00:57:09 riz Exp $"); |
61 | | | 61 | |
62 | #ifdef _KERNEL_OPT | | 62 | #ifdef _KERNEL_OPT |
63 | #include "opt_pax.h" | | 63 | #include "opt_pax.h" |
64 | #endif /* _KERNEL_OPT */ | | 64 | #endif /* _KERNEL_OPT */ |
65 | | | 65 | |
66 | #include <sys/param.h> | | 66 | #include <sys/param.h> |
67 | #include <sys/proc.h> | | 67 | #include <sys/proc.h> |
68 | #include <sys/kmem.h> | | 68 | #include <sys/kmem.h> |
69 | #include <sys/namei.h> | | 69 | #include <sys/namei.h> |
70 | #include <sys/vnode.h> | | 70 | #include <sys/vnode.h> |
71 | #include <sys/exec.h> | | 71 | #include <sys/exec.h> |
72 | #include <sys/exec_elf.h> | | 72 | #include <sys/exec_elf.h> |
73 | #include <sys/syscall.h> | | 73 | #include <sys/syscall.h> |
| @@ -929,33 +929,40 @@ netbsd_elf_signature(struct lwp *l, stru | | | @@ -929,33 +929,40 @@ netbsd_elf_signature(struct lwp *l, stru |
929 | case ELF_NOTE_TYPE_NETBSD_TAG: | | 929 | case ELF_NOTE_TYPE_NETBSD_TAG: |
930 | /* It is us */ | | 930 | /* It is us */ |
931 | if (np->n_namesz == ELF_NOTE_NETBSD_NAMESZ && | | 931 | if (np->n_namesz == ELF_NOTE_NETBSD_NAMESZ && |
932 | np->n_descsz == ELF_NOTE_NETBSD_DESCSZ && | | 932 | np->n_descsz == ELF_NOTE_NETBSD_DESCSZ && |
933 | memcmp(ndata, ELF_NOTE_NETBSD_NAME, | | 933 | memcmp(ndata, ELF_NOTE_NETBSD_NAME, |
934 | ELF_NOTE_NETBSD_NAMESZ) == 0) { | | 934 | ELF_NOTE_NETBSD_NAMESZ) == 0) { |
935 | memcpy(&epp->ep_osversion, ndesc, | | 935 | memcpy(&epp->ep_osversion, ndesc, |
936 | ELF_NOTE_NETBSD_DESCSZ); | | 936 | ELF_NOTE_NETBSD_DESCSZ); |
937 | isnetbsd = 1; | | 937 | isnetbsd = 1; |
938 | break; | | 938 | break; |
939 | } | | 939 | } |
940 | | | 940 | |
941 | /* | | 941 | /* |
942 | * Ignore SuSE tags; SuSE's n_type is the same as NetBSD's | | 942 | * Ignore SuSE tags; SuSE's n_type is the same the |
943 | * one. | | 943 | * NetBSD one. |
944 | */ | | 944 | */ |
945 | if (np->n_namesz == ELF_NOTE_SUSE_NAMESZ && | | 945 | if (np->n_namesz == ELF_NOTE_SUSE_NAMESZ && |
946 | memcmp(ndata, ELF_NOTE_SUSE_NAME, | | 946 | memcmp(ndata, ELF_NOTE_SUSE_NAME, |
947 | ELF_NOTE_SUSE_NAMESZ) == 0) | | 947 | ELF_NOTE_SUSE_NAMESZ) == 0) |
948 | break; | | 948 | break; |
| | | 949 | /* |
| | | 950 | * Ignore old GCC |
| | | 951 | */ |
| | | 952 | if (np->n_namesz == ELF_NOTE_OGCC_NAMESZ && |
| | | 953 | memcmp(ndata, ELF_NOTE_OGCC_NAME, |
| | | 954 | ELF_NOTE_OGCC_NAMESZ) == 0) |
| | | 955 | break; |
949 | BADNOTE("NetBSD tag"); | | 956 | BADNOTE("NetBSD tag"); |
950 | goto bad; | | 957 | goto bad; |
951 | | | 958 | |
952 | case ELF_NOTE_TYPE_PAX_TAG: | | 959 | case ELF_NOTE_TYPE_PAX_TAG: |
953 | if (np->n_namesz == ELF_NOTE_PAX_NAMESZ && | | 960 | if (np->n_namesz == ELF_NOTE_PAX_NAMESZ && |
954 | np->n_descsz == ELF_NOTE_PAX_DESCSZ && | | 961 | np->n_descsz == ELF_NOTE_PAX_DESCSZ && |
955 | memcmp(ndata, ELF_NOTE_PAX_NAME, | | 962 | memcmp(ndata, ELF_NOTE_PAX_NAME, |
956 | ELF_NOTE_PAX_NAMESZ) == 0) { | | 963 | ELF_NOTE_PAX_NAMESZ) == 0) { |
957 | memcpy(&epp->ep_pax_flags, ndesc, | | 964 | memcpy(&epp->ep_pax_flags, ndesc, |
958 | sizeof(epp->ep_pax_flags)); | | 965 | sizeof(epp->ep_pax_flags)); |
959 | break; | | 966 | break; |
960 | } | | 967 | } |
961 | BADNOTE("PaX tag"); | | 968 | BADNOTE("PaX tag"); |
| @@ -994,26 +1001,29 @@ netbsd_elf_signature(struct lwp *l, stru | | | @@ -994,26 +1001,29 @@ netbsd_elf_signature(struct lwp *l, stru |
994 | && memcmp(ndata, ELF_NOTE_MCMODEL_NAME, | | 1001 | && memcmp(ndata, ELF_NOTE_MCMODEL_NAME, |
995 | ELF_NOTE_MCMODEL_NAMESZ) == 0) { | | 1002 | ELF_NOTE_MCMODEL_NAMESZ) == 0) { |
996 | ELF_MD_MCMODEL_CHECK(epp, ndesc, np->n_descsz); | | 1003 | ELF_MD_MCMODEL_CHECK(epp, ndesc, np->n_descsz); |
997 | break; | | 1004 | break; |
998 | } | | 1005 | } |
999 | BADNOTE("mcmodel tag"); | | 1006 | BADNOTE("mcmodel tag"); |
1000 | goto bad; | | 1007 | goto bad; |
1001 | #endif | | 1008 | #endif |
1002 | break; | | 1009 | break; |
1003 | | | 1010 | |
1004 | case ELF_NOTE_TYPE_SUSE_VERSION_TAG: | | 1011 | case ELF_NOTE_TYPE_SUSE_VERSION_TAG: |
1005 | break; | | 1012 | break; |
1006 | | | 1013 | |
| | | 1014 | case ELF_NOTE_TYPE_GO_BUILDID_TAG: |
| | | 1015 | break; |
| | | 1016 | |
1007 | default: | | 1017 | default: |
1008 | BADNOTE("unknown tag"); | | 1018 | BADNOTE("unknown tag"); |
1009 | bad: | | 1019 | bad: |
1010 | #ifdef DIAGNOSTIC | | 1020 | #ifdef DIAGNOSTIC |
1011 | /* Ignore GNU tags */ | | 1021 | /* Ignore GNU tags */ |
1012 | if (np->n_namesz == ELF_NOTE_GNU_NAMESZ && | | 1022 | if (np->n_namesz == ELF_NOTE_GNU_NAMESZ && |
1013 | memcmp(ndata, ELF_NOTE_GNU_NAME, | | 1023 | memcmp(ndata, ELF_NOTE_GNU_NAME, |
1014 | ELF_NOTE_GNU_NAMESZ) == 0) | | 1024 | ELF_NOTE_GNU_NAMESZ) == 0) |
1015 | break; | | 1025 | break; |
1016 | | | 1026 | |
1017 | int ns = MIN(np->n_namesz, shp->sh_size - sizeof(*np)); | | 1027 | int ns = MIN(np->n_namesz, shp->sh_size - sizeof(*np)); |
1018 | printf("%s: Unknown elf note type %d (%s): " | | 1028 | printf("%s: Unknown elf note type %d (%s): " |
1019 | "[namesz=%d, descsz=%d name=%-*.*s]\n", | | 1029 | "[namesz=%d, descsz=%d name=%-*.*s]\n", |