svn commit: r311155 - stable/11/contrib/elftoolchain/elfcopy

Ed Maste emaste at FreeBSD.org
Tue Jan 3 15:57:48 UTC 2017


Author: emaste
Date: Tue Jan  3 15:57:47 2017
New Revision: 311155
URL: https://svnweb.freebsd.org/changeset/base/311155

Log:
  MFC r310634: 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

Modified:
  stable/11/contrib/elftoolchain/elfcopy/pe.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/contrib/elftoolchain/elfcopy/pe.c
==============================================================================
--- stable/11/contrib/elftoolchain/elfcopy/pe.c	Tue Jan  3 14:52:39 2017	(r311154)
+++ stable/11/contrib/elftoolchain/elfcopy/pe.c	Tue Jan  3 15:57:47 2017	(r311155)
@@ -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-all mailing list