svn commit: r310634 - head/contrib/elftoolchain/elfcopy

Ed Maste emaste at FreeBSD.org
Tue Dec 27 17:31:08 UTC 2016


Author: emaste
Date: Tue Dec 27 17:31:07 2016
New Revision: 310634
URL: https://svnweb.freebsd.org/changeset/base/310634

Log:
  elfcopy: fix PE object section name corruption and crash
  
  Fixed a bug that the PE object section names are generated incorrectly
  using the section name table found in the original input ELF object
  instead of the intermediate ELF object.
  
  Ticket:		#541
  
  Do not try to copy section content from a NULL d_buf when creating
  uninitialized data COFF section for PE object.
  
  Ticket:		#540
  
  Obtained from:	ELF Tool Chain r3507, r3508
  MFC after:	1 week

Modified:
  head/contrib/elftoolchain/elfcopy/pe.c

Modified: head/contrib/elftoolchain/elfcopy/pe.c
==============================================================================
--- head/contrib/elftoolchain/elfcopy/pe.c	Tue Dec 27 17:13:31 2016	(r310633)
+++ head/contrib/elftoolchain/elfcopy/pe.c	Tue Dec 27 17:31:07 2016	(r310634)
@@ -70,7 +70,7 @@ create_pe(struct elfcopy *ecp, int ifd, 
 		errx(EXIT_FAILURE, "gelf_getehdr() failed: %s",
 		    elf_errmsg(-1));
 
-	if (elf_getshstrndx(ecp->ein, &indx) == 0)
+	if (elf_getshstrndx(e, &indx) == 0)
 		errx(EXIT_FAILURE, "elf_getshstrndx() failed: %s",
 		    elf_errmsg(-1));
 
@@ -124,7 +124,7 @@ create_pe(struct elfcopy *ecp, int ifd, 
 			(void) elf_errno();
 			continue;
 		}
-		if ((name = elf_strptr(ecp->ein, indx, sh.sh_name)) ==
+		if ((name = elf_strptr(e, indx, sh.sh_name)) ==
 		    NULL) {
 			warnx("elf_strptr() failed: %s", elf_errmsg(-1));
 			(void) elf_errno();
@@ -210,12 +210,14 @@ create_pe(struct elfcopy *ecp, int ifd, 
 		}
 		pb->pb_align = 1;
 		pb->pb_off = 0;
-		pb->pb_size = roundup(sh.sh_size, poh.oh_filealign);
-		if ((pb->pb_buf = calloc(1, pb->pb_size)) == NULL) {
-			warn("calloc failed");
-			continue;
+		if (sh.sh_type != SHT_NOBITS) {
+			pb->pb_size = roundup(sh.sh_size, poh.oh_filealign);
+			if ((pb->pb_buf = calloc(1, pb->pb_size)) == NULL) {
+				warn("calloc failed");
+				continue;
+			}
+			memcpy(pb->pb_buf, d->d_buf, sh.sh_size);
 		}
-		memcpy(pb->pb_buf, d->d_buf, sh.sh_size);
 	}
 	elferr = elf_errno();
 	if (elferr != 0)


More information about the svn-src-head mailing list