Author: kib
Date: Sun Mar 11 19:38:49 2012
New Revision: 232828
URL: http://svn.freebsd.org/changeset/base/232828

Log:
  ELF image can have several PT_NOTE program headers.  Look for the ELF
  brand note in each header, instead of using only first one.
  
  Reviewed by:  kan
  Tested by:    andrew (arm), flo (sparc64)
  MFC after:    3 weeks

Modified:
  head/sys/kern/imgact_elf.c

Modified: head/sys/kern/imgact_elf.c
==============================================================================
--- head/sys/kern/imgact_elf.c  Sun Mar 11 19:23:42 2012        (r232827)
+++ head/sys/kern/imgact_elf.c  Sun Mar 11 19:38:49 2012        (r232828)
@@ -1549,32 +1549,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);
@@ -1613,6 +1595,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) = {
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to