svn commit: r310136 - head/contrib/elftoolchain/libelf

Conrad E. Meyer cem at FreeBSD.org
Fri Dec 16 01:39:08 UTC 2016


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);
 }


More information about the svn-src-head mailing list