diff options
author | kib <kib@FreeBSD.org> | 2017-03-19 15:46:25 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2017-03-19 15:46:25 +0000 |
commit | 2831af3700d554077711c54ad7469a2ed4e7dfe1 (patch) | |
tree | ee8fc10952cc51d2fb5bf0d084c94c8f48cd50a4 | |
parent | 7fd1883417d0602310c2d46796ce4438448ea8a4 (diff) | |
download | FreeBSD-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.c | 10 |
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; |