Author: cem
Date: Fri Dec 16 01:39:06 2016
New Revision: 310136
URL: https://svnweb.freebsd.org/changeset/base/310136

Log:
  libelf: Fix extended numbering detection
  
  Extended numbering is used for any of these fields overflowing.
  
  Reviewed by:  emaste@
  Sponsored by: Dell EMC Isilon
  Differential Revision:        https://reviews.freebsd.org/D8701

Modified:
  head/contrib/elftoolchain/libelf/libelf_ehdr.c

Modified: head/contrib/elftoolchain/libelf/libelf_ehdr.c
==============================================================================
--- head/contrib/elftoolchain/libelf/libelf_ehdr.c      Fri Dec 16 01:37:44 
2016        (r310135)
+++ head/contrib/elftoolchain/libelf/libelf_ehdr.c      Fri Dec 16 01:39:06 
2016        (r310136)
@@ -170,10 +170,6 @@ _libelf_ehdr(Elf *e, int ec, int allocat
        (*xlator)((unsigned char*) ehdr, msz, e->e_rawfile, (size_t) 1,
            e->e_byteorder != LIBELF_PRIVATE(byteorder));
 
-       /*
-        * If extended numbering is being used, read the correct
-        * number of sections and program header entries.
-        */
        if (ec == ELFCLASS32) {
                phnum = ((Elf32_Ehdr *) ehdr)->e_phnum;
                shnum = ((Elf32_Ehdr *) ehdr)->e_shnum;
@@ -193,12 +189,19 @@ _libelf_ehdr(Elf *e, int ec, int allocat
                return (NULL);
        }
 
-       if (shnum != 0 || shoff == 0LL) { /* not using extended numbering */
+       /*
+        * If extended numbering is being used, read the correct
+        * number of sections and program header entries.
+        */
+       if ((shnum == 0 && shoff != 0) || phnum == PN_XNUM || strndx == 
SHN_XINDEX) {
+               if (_libelf_load_extended(e, ec, shoff, phnum, strndx) == 0)
+                       return (NULL);
+       } else {
+               /* not using extended numbering */
                e->e_u.e_elf.e_nphdr = phnum;
                e->e_u.e_elf.e_nscn = shnum;
                e->e_u.e_elf.e_strndx = strndx;
-       } else if (_libelf_load_extended(e, ec, shoff, phnum, strndx) == 0)
-               return (NULL);
+       }
 
        return (ehdr);
 }
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to