svn commit: r233766 - stable/8/sys/kern

Konstantin Belousov kib at FreeBSD.org
Sun Apr 1 21:35:35 UTC 2012


Author: kib
Date: Sun Apr  1 21:35:34 2012
New Revision: 233766
URL: http://svn.freebsd.org/changeset/base/233766

Log:
  MFC r232828:
  ELF image can have several PT_NOTE program headers.  Look for the ELF
  brand note in each header, instead of using only first one.

Modified:
  stable/8/sys/kern/imgact_elf.c
Directory Properties:
  stable/8/sys/   (props changed)

Modified: stable/8/sys/kern/imgact_elf.c
==============================================================================
--- stable/8/sys/kern/imgact_elf.c	Sun Apr  1 21:13:13 2012	(r233765)
+++ stable/8/sys/kern/imgact_elf.c	Sun Apr  1 21:35:34 2012	(r233766)
@@ -1395,32 +1395,14 @@ __elfN(putnote)(void *dst, size_t *off, 
 	*off += roundup2(note.n_descsz, sizeof(Elf_Size));
 }
 
-/*
- * Try to find the appropriate ABI-note section for checknote,
- * fetch the osreldate for binary from the ELF OSABI-note. Only the
- * first page of the image is searched, the same as for headers.
- */
 static boolean_t
-__elfN(check_note)(struct image_params *imgp, Elf_Brandnote *checknote,
-    int32_t *osrel)
+__elfN(parse_notes)(struct image_params *imgp, Elf_Brandnote *checknote,
+    int32_t *osrel, const Elf_Phdr *pnote)
 {
 	const Elf_Note *note, *note0, *note_end;
-	const Elf_Phdr *phdr, *pnote;
-	const Elf_Ehdr *hdr;
 	const char *note_name;
 	int i;
 
-	pnote = NULL;
-	hdr = (const Elf_Ehdr *)imgp->image_header;
-	phdr = (const Elf_Phdr *)(imgp->image_header + hdr->e_phoff);
-
-	for (i = 0; i < hdr->e_phnum; i++) {
-		if (phdr[i].p_type == PT_NOTE) {
-			pnote = &phdr[i];
-			break;
-		}
-	}
-
 	if (pnote == NULL || pnote->p_offset >= PAGE_SIZE ||
 	    pnote->p_offset + pnote->p_filesz >= PAGE_SIZE)
 		return (FALSE);
@@ -1459,6 +1441,31 @@ nextnote:
 }
 
 /*
+ * Try to find the appropriate ABI-note section for checknote,
+ * fetch the osreldate for binary from the ELF OSABI-note. Only the
+ * first page of the image is searched, the same as for headers.
+ */
+static boolean_t
+__elfN(check_note)(struct image_params *imgp, Elf_Brandnote *checknote,
+    int32_t *osrel)
+{
+	const Elf_Phdr *phdr;
+	const Elf_Ehdr *hdr;
+	int i;
+
+	hdr = (const Elf_Ehdr *)imgp->image_header;
+	phdr = (const Elf_Phdr *)(imgp->image_header + hdr->e_phoff);
+
+	for (i = 0; i < hdr->e_phnum; i++) {
+		if (phdr[i].p_type == PT_NOTE &&
+		    __elfN(parse_notes)(imgp, checknote, osrel, &phdr[i]))
+			return (TRUE);
+	}
+	return (FALSE);
+
+}
+
+/*
  * Tell kern_execve.c about it, with a little help from the linker.
  */
 static struct execsw __elfN(execsw) = {


More information about the svn-src-stable mailing list