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)
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to