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;
     }