diff options
author | Andrew Waterman <andrew@sifive.com> | 2024-04-17 14:58:02 -0700 |
---|---|---|
committer | Andrew Waterman <andrew@sifive.com> | 2024-04-17 14:58:02 -0700 |
commit | c917315bf7a91e897f6464c62bdda01f9635536a (patch) | |
tree | 9bdf2b948fe040eff5b57647c02869c9ec4cd03f | |
parent | 1f326d6ed85e8d19478d19a46395c9c6f04f40d7 (diff) | |
download | pk-c917315bf7a91e897f6464c62bdda01f9635536a.zip pk-c917315bf7a91e897f6464c62bdda01f9635536a.tar.gz pk-c917315bf7a91e897f6464c62bdda01f9635536a.tar.bz2 |
Don't mmap ELF segments with zero filesz
-rw-r--r-- | pk/elf.c | 6 |
1 files changed, 4 insertions, 2 deletions
@@ -84,8 +84,10 @@ void load_elf(const char* fn, elf_info* info) info->brk_min = vaddr + ph[i].p_memsz; int flags2 = flags | (prepad ? MAP_POPULATE : 0); int prot = get_prot(ph[i].p_flags); - if (__do_mmap(vaddr - prepad, ph[i].p_filesz + prepad, prot | PROT_WRITE, flags2, file, ph[i].p_offset - prepad) != vaddr - prepad) - goto fail; + if (ph[i].p_filesz != 0) { + if (__do_mmap(vaddr - prepad, ph[i].p_filesz + prepad, prot | PROT_WRITE, flags2, file, ph[i].p_offset - prepad) != vaddr - prepad) + goto fail; + } memset_user((void*)vaddr - prepad, 0, prepad); if (!(prot & PROT_WRITE)) if (do_mprotect(vaddr - prepad, ph[i].p_filesz + prepad, prot)) |