diff options
author | emaste <emaste@FreeBSD.org> | 2017-01-03 15:57:47 +0000 |
---|---|---|
committer | emaste <emaste@FreeBSD.org> | 2017-01-03 15:57:47 +0000 |
commit | fddc6060074fdfdf9d2087cd342da4d1e7ff3708 (patch) | |
tree | 34af9de7ed1c223c30a66e1a8087627ed6343fb1 /contrib/elftoolchain | |
parent | 68540e4f8ff0865e1b161739ea86ac2042beb343 (diff) | |
download | FreeBSD-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.c | 16 |
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) |