Browse Source

LibELF: Use MAP_FIXED_NOREPLACE for address space reservation

This ensures that we don't corrupt our address space if a non-PIE
program's requested address space happens to coincide with memory we
already use.
Daniel Bertalan 3 năm trước cách đây
mục cha
commit
d1ef8e63f7

+ 5 - 1
Userland/Libraries/LibELF/DynamicLoader.cpp

@@ -292,8 +292,10 @@ void DynamicLoader::load_program_headers()
     int reservation_mmap_flags = MAP_ANON | MAP_PRIVATE | MAP_NORESERVE;
     int reservation_mmap_flags = MAP_ANON | MAP_PRIVATE | MAP_NORESERVE;
     if (m_elf_image.is_dynamic())
     if (m_elf_image.is_dynamic())
         reservation_mmap_flags |= MAP_RANDOMIZED;
         reservation_mmap_flags |= MAP_RANDOMIZED;
+#ifdef MAP_FIXED_NOREPLACE
     else
     else
-        reservation_mmap_flags |= MAP_FIXED;
+        reservation_mmap_flags |= MAP_FIXED_NOREPLACE;
+#endif
 
 
     // First, we make a dummy reservation mapping, in order to allocate enough VM
     // First, we make a dummy reservation mapping, in order to allocate enough VM
     // to hold all regions contiguously in the address space.
     // to hold all regions contiguously in the address space.
@@ -309,6 +311,8 @@ void DynamicLoader::load_program_headers()
         VERIFY_NOT_REACHED();
         VERIFY_NOT_REACHED();
     }
     }
 
 
+    VERIFY(requested_load_address == nullptr || reservation == requested_load_address);
+
     m_base_address = VirtualAddress { reservation };
     m_base_address = VirtualAddress { reservation };
 
 
     // Then we unmap the reservation.
     // Then we unmap the reservation.