From c3ee70591ae8a2e60326d42e114532127bebf366 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 13 Apr 2021 19:29:34 +0200 Subject: [PATCH] Kernel: Read the ELF header from the inode rather than the mapped pages Reading from the mapping doesn't work when the text segment has a non-zero offset because in that case the first mapped page doesn't contain the ELF header. --- Kernel/Syscalls/mmap.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Kernel/Syscalls/mmap.cpp b/Kernel/Syscalls/mmap.cpp index 3e8ede3c8a..477fe14aef 100644 --- a/Kernel/Syscalls/mmap.cpp +++ b/Kernel/Syscalls/mmap.cpp @@ -64,11 +64,14 @@ static bool should_make_executable_exception_for_dynamic_loader(bool make_readab if (!region.vmobject().is_private_inode()) return false; - Elf32_Ehdr header; - if (!copy_from_user(&header, region.vaddr().as_ptr(), sizeof(header))) - return false; + auto& inode_vm = static_cast(region.vmobject()); + auto& inode = inode_vm.inode(); - auto& inode = static_cast(region.vmobject()); + Elf32_Ehdr header; + auto buffer = UserOrKernelBuffer::for_kernel_buffer((u8*)&header); + auto nread = inode.read_bytes(0, sizeof(header), buffer, nullptr); + if (nread != sizeof(header)) + return false; // The file is a valid ELF binary if (!ELF::validate_elf_header(header, inode.size()))