Module Name: src
Committed By: christos
Date: Tue May 22 02:40:06 UTC 2012
Modified Files:
src/sys/kern: exec_elf.c
src/sys/sys: exec_elf.h
Log Message:
- Recognize the SuSE ABI note.
- Restructure the code to do the checking in the appropriate note type,
and harmonize all the checks to be positive.
- Print only the tag data being careful not to overrun the allocated buffer.
To generate a diff of this commit:
cvs rdiff -u -r1.38 -r1.39 src/sys/kern/exec_elf.c
cvs rdiff -u -r1.122 -r1.123 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.38 src/sys/kern/exec_elf.c:1.39
--- src/sys/kern/exec_elf.c:1.38 Sun Apr 8 07:27:44 2012
+++ src/sys/kern/exec_elf.c Mon May 21 22:40:05 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: exec_elf.c,v 1.38 2012/04/08 11:27:44 martin Exp $ */
+/* $NetBSD: exec_elf.c,v 1.39 2012/05/22 02:40:05 christos 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.38 2012/04/08 11:27:44 martin Exp $");
+__KERNEL_RCSID(1, "$NetBSD: exec_elf.c,v 1.39 2012/05/22 02:40:05 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_pax.h"
@@ -891,15 +891,40 @@ netbsd_elf_signature(struct lwp *l, stru
continue;
ndata = (char *)(np + 1);
+ unsigned int maxlen = (unsigned int)(shp->sh_size -
+ ((char *)ndata - (char *)np));
+ if (maxlen < np->n_namesz)
+ goto bad;
switch (np->n_type) {
case ELF_NOTE_TYPE_NETBSD_TAG:
- if (np->n_namesz != ELF_NOTE_NETBSD_NAMESZ ||
- np->n_descsz != ELF_NOTE_NETBSD_DESCSZ ||
+ /*
+ * It is us
+ */
+ if (np->n_namesz == ELF_NOTE_NETBSD_NAMESZ &&
+ np->n_descsz == ELF_NOTE_NETBSD_DESCSZ &&
memcmp(ndata, ELF_NOTE_NETBSD_NAME,
- ELF_NOTE_NETBSD_NAMESZ))
- goto bad;
- isnetbsd = 1;
- break;
+ ELF_NOTE_NETBSD_NAMESZ) == 0) {
+ isnetbsd = 1;
+ break;
+ }
+ /*
+ * Ignore GNU tags
+ */
+ if (np->n_namesz == ELF_NOTE_GNU_NAMESZ &&
+ memcmp(ndata, ELF_NOTE_GNU_NAME,
+ ELF_NOTE_GNU_NAMESZ) == 0)
+ break;
+ /*
+ * Ignore SuSE tags
+ */
+ if (np->n_namesz == ELF_NOTE_SUSE_NAMESZ &&
+ memcmp(ndata, ELF_NOTE_SUSE_NAME,
+ ELF_NOTE_SUSE_NAMESZ) == 0)
+ break;
+ /*
+ * Dunno, warn for diagnostic
+ */
+ goto bad;
case ELF_NOTE_TYPE_PAX_TAG:
if (np->n_namesz != ELF_NOTE_PAX_NAMESZ ||
@@ -907,26 +932,14 @@ netbsd_elf_signature(struct lwp *l, stru
memcmp(ndata, ELF_NOTE_PAX_NAME,
ELF_NOTE_PAX_NAMESZ)) {
bad:
- /*
- * Ignore GNU tags
- */
- if (np->n_namesz == ELF_NOTE_GNU_NAMESZ &&
- memcmp(ndata, ELF_NOTE_GNU_NAME,
- ELF_NOTE_GNU_NAMESZ) == 0)
- break;
#ifdef DIAGNOSTIC
- printf("%s: bad tag %d: "
- "[%d %d, %d %d, %*.*s %*.*s]\n",
- epp->ep_kname,
- np->n_type,
- np->n_namesz, ELF_NOTE_PAX_NAMESZ,
- np->n_descsz, ELF_NOTE_PAX_DESCSZ,
- ELF_NOTE_PAX_NAMESZ,
- ELF_NOTE_PAX_NAMESZ,
- ndata,
- ELF_NOTE_PAX_NAMESZ,
- ELF_NOTE_PAX_NAMESZ,
- ELF_NOTE_PAX_NAME);
+ {
+ int ns = MIN(np->n_namesz, maxlen);
+ printf("%s: Unknown elf note type %d: "
+ "[namesz=%d, descsz=%d name=%*.*s]\n",
+ epp->ep_kname, np->n_type, np->n_namesz,
+ np->n_descsz, ns, ns, ndata);
+ }
#endif
continue;
}
@@ -935,7 +948,7 @@ bad:
sizeof(epp->ep_pax_flags));
break;
- case ELF_NOTE_TYPE_SUSE_TAG:
+ case ELF_NOTE_TYPE_SUSE_VERSION_TAG:
break;
default:
Index: src/sys/sys/exec_elf.h
diff -u src/sys/sys/exec_elf.h:1.122 src/sys/sys/exec_elf.h:1.123
--- src/sys/sys/exec_elf.h:1.122 Sat Feb 4 13:12:02 2012
+++ src/sys/sys/exec_elf.h Mon May 21 22:40:06 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: exec_elf.h,v 1.122 2012/02/04 18:12:02 joerg Exp $ */
+/* $NetBSD: exec_elf.h,v 1.123 2012/05/22 02:40:06 christos Exp $ */
/*-
* Copyright (c) 1994 The NetBSD Foundation, Inc.
@@ -805,6 +805,23 @@ typedef struct {
*/
#define ELF_NOTE_TYPE_GNU_BUILD_ID 3
+/* SuSE-specific note type: ABI
+ * name: SuSE\0
+ * namesz: 5
+ * desc:
+ * half[0] = MMmm
+ *
+ * M = product major version
+ * m = product minor version
+ * descsz: 2
+ */
+#define ELF_NOTE_TYPE_SUSE_TAG 1
+/* SuSE-specific note name and description sizes */
+#define ELF_NOTE_SUSE_NAMESZ 5
+#define ELF_NOTE_SUSE_DESCSZ 2
+/* SuSE-specific note name */
+#define ELF_NOTE_SUSE_NAME "SuSE\0"
+
/* SuSE-specific note type: version
* name: SuSE\0\0\0\0
* namesz: 8
@@ -817,12 +834,12 @@ typedef struct {
* m = product minor version
* descsz: 8
*/
-#define ELF_NOTE_TYPE_SUSE_TAG 0x45537553 /* SuSE in LE */
+#define ELF_NOTE_TYPE_SUSE_VERSION_TAG 0x45537553 /* SuSE in LE */
/* SuSE-specific note name and description sizes */
-#define ELF_NOTE_SUSE_NAMESZ 8
-#define ELF_NOTE_SUSE_DESCSZ 8
+#define ELF_NOTE_SUSE_VERSION_NAMESZ 8
+#define ELF_NOTE_SUSE_VERSION_DESCSZ 8
/* SuSE-specific note name */
-#define ELF_NOTE_SUSE_NAME "SuSE\0\0\0\0"
+#define ELF_NOTE_SUSE_VERSION_NAME "SuSE\0\0\0\0"
/* NetBSD-specific note type: Emulation name.
* name: NetBSD\0\0