summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2017-03-19 15:46:25 +0000
committerkib <kib@FreeBSD.org>2017-03-19 15:46:25 +0000
commit2831af3700d554077711c54ad7469a2ed4e7dfe1 (patch)
treeee8fc10952cc51d2fb5bf0d084c94c8f48cd50a4
parent7fd1883417d0602310c2d46796ce4438448ea8a4 (diff)
downloadFreeBSD-src-2831af3700d554077711c54ad7469a2ed4e7dfe1.zip
FreeBSD-src-2831af3700d554077711c54ad7469a2ed4e7dfe1.tar.gz
MFC r315157:
Accept linkers representation for ELF segments with zero on-disk length.
-rw-r--r--sys/kern/imgact_elf.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c
index 36fe4bd..05b391b 100644
--- a/sys/kern/imgact_elf.c
+++ b/sys/kern/imgact_elf.c
@@ -522,7 +522,8 @@ __elfN(load_section)(struct image_params *imgp, vm_ooffset_t offset,
* While I'm here, might as well check for something else that
* is invalid: filsz cannot be greater than memsz.
*/
- if ((off_t)filsz + offset > imgp->attr->va_size || filsz > memsz) {
+ if ((filsz != 0 && (off_t)filsz + offset > imgp->attr->va_size) ||
+ filsz > memsz) {
uprintf("elf_load_section: truncated ELF file\n");
return (ENOEXEC);
}
@@ -538,7 +539,9 @@ __elfN(load_section)(struct image_params *imgp, vm_ooffset_t offset,
* early and copy the initialized data into that first page. We
* choose the second.
*/
- if (memsz > filsz)
+ if (filsz == 0)
+ map_len = 0;
+ else if (memsz > filsz)
map_len = trunc_page_ps(offset + filsz, pagesize) - file_addr;
else
map_len = round_page_ps(offset + filsz, pagesize) - file_addr;
@@ -570,7 +573,8 @@ __elfN(load_section)(struct image_params *imgp, vm_ooffset_t offset,
* segment in the file is extended to provide bss. It's a neat idea
* to try and save a page, but it's a pain in the behind to implement.
*/
- copy_len = (offset + filsz) - trunc_page_ps(offset + filsz, pagesize);
+ copy_len = filsz == 0 ? 0 : (offset + filsz) - trunc_page_ps(offset +
+ filsz, pagesize);
map_addr = trunc_page_ps((vm_offset_t)vmaddr + filsz, pagesize);
map_len = round_page_ps((vm_offset_t)vmaddr + memsz, pagesize) -
map_addr;
OpenPOWER on IntegriCloud