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