diff --git a/mmu.cc b/mmu.cc index 2ba5f6618bc3167587f1e1ae36d2db76eca34195..0a7f918de461d8593e64c27a8a3f77b9fe6e6ee7 100644 --- a/mmu.cc +++ b/mmu.cc @@ -131,8 +131,14 @@ namespace mmu { vma* map_file(void* addr, size_t size, unsigned perm, file& f, f_offset offset) { + auto fsize = f.size(); + if (offset >= fsize) { + return map_anon(addr, size, perm); + } vma* ret = map_anon_dontzero(addr, size, perm); - f.read(addr, offset, size); + auto rsize = std::min(offset + size, fsize) - offset; + f.read(addr, offset, rsize); + memset(addr + rsize, 0, size - rsize); return ret; }