Bladeren bron

Kernel: Fix rounding of PT_LOAD mappings in sys$execve()

We were not rounding the mappings down/up correctly, which could lead
to executables missing the last 4 KB of text and/or data.
Andreas Kling 4 jaren geleden
bovenliggende
commit
423ed53396
1 gewijzigde bestanden met toevoegingen van 5 en 1 verwijderingen
  1. 5 1
      Kernel/Syscalls/execve.cpp

+ 5 - 1
Kernel/Syscalls/execve.cpp

@@ -340,7 +340,11 @@ static KResultOr<LoadResult> load_elf_object(NonnullOwnPtr<Space> new_space, Fil
             if (program_header.is_writable())
                 prot |= PROT_WRITE;
             auto region_name = String::formatted("{} (data-{}{})", elf_name, program_header.is_readable() ? "r" : "", program_header.is_writable() ? "w" : "");
-            auto range = new_space->allocate_range(program_header.vaddr().offset(load_offset), program_header.size_in_memory());
+
+            auto range_base = VirtualAddress { page_round_down(program_header.vaddr().offset(load_offset).get()) };
+            auto range_end = VirtualAddress { page_round_up(program_header.vaddr().offset(load_offset).offset(program_header.size_in_memory()).get()) };
+
+            auto range = new_space->allocate_range(range_base, range_end.get() - range_base.get());
             if (!range.has_value()) {
                 ph_load_result = ENOMEM;
                 return IterationDecision::Break;