mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 19:27:45 +00:00
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.
This commit is contained in:
parent
2d91761cf6
commit
c3ee70591a
1 changed files with 7 additions and 4 deletions
|
@ -64,11 +64,14 @@ static bool should_make_executable_exception_for_dynamic_loader(bool make_readab
|
||||||
if (!region.vmobject().is_private_inode())
|
if (!region.vmobject().is_private_inode())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Elf32_Ehdr header;
|
auto& inode_vm = static_cast<const InodeVMObject&>(region.vmobject());
|
||||||
if (!copy_from_user(&header, region.vaddr().as_ptr(), sizeof(header)))
|
auto& inode = inode_vm.inode();
|
||||||
return false;
|
|
||||||
|
|
||||||
auto& inode = static_cast<const InodeVMObject&>(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
|
// The file is a valid ELF binary
|
||||||
if (!ELF::validate_elf_header(header, inode.size()))
|
if (!ELF::validate_elf_header(header, inode.size()))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue