summaryrefslogtreecommitdiffstats
path: root/contrib/elftoolchain
diff options
context:
space:
mode:
authoremaste <emaste@FreeBSD.org>2017-01-03 15:57:47 +0000
committeremaste <emaste@FreeBSD.org>2017-01-03 15:57:47 +0000
commitfddc6060074fdfdf9d2087cd342da4d1e7ff3708 (patch)
tree34af9de7ed1c223c30a66e1a8087627ed6343fb1 /contrib/elftoolchain
parent68540e4f8ff0865e1b161739ea86ac2042beb343 (diff)
downloadFreeBSD-src-fddc6060074fdfdf9d2087cd342da4d1e7ff3708.zip
FreeBSD-src-fddc6060074fdfdf9d2087cd342da4d1e7ff3708.tar.gz
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
Diffstat (limited to 'contrib/elftoolchain')
-rw-r--r--contrib/elftoolchain/elfcopy/pe.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/contrib/elftoolchain/elfcopy/pe.c b/contrib/elftoolchain/elfcopy/pe.c
index 8deb809..0e02e0b 100644
--- a/contrib/elftoolchain/elfcopy/pe.c
+++ b/contrib/elftoolchain/elfcopy/pe.c
@@ -70,7 +70,7 @@ create_pe(struct elfcopy *ecp, int ifd, int ofd)
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, int ofd)
(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, int ofd)
}
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)
OpenPOWER on IntegriCloud