1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 17:17:44 +00:00

Kernel: Don't fetch full inode metadata in sys$execve()

We only need the size, so let's not fetch all the metadata.
This commit is contained in:
Andreas Kling 2020-12-25 14:15:33 +01:00
parent c3eddbcb49
commit 9c640e67ac

View file

@ -67,15 +67,16 @@ KResultOr<Process::LoadResult> Process::load_elf_object(FileDescription& object_
dbgln("Refusing to execute a write-mapped program");
return KResult(-ETXTBSY);
}
InodeMetadata loader_metadata = object_description.metadata();
auto region = MM.allocate_kernel_region_with_vmobject(*vmobject, PAGE_ROUND_UP(loader_metadata.size), "ELF loading", Region::Access::Read);
size_t executable_size = inode.size();
auto region = MM.allocate_kernel_region_with_vmobject(*vmobject, PAGE_ROUND_UP(executable_size), "ELF loading", Region::Access::Read);
if (!region) {
dbgln("Could not allocate memory for ELF loading");
return KResult(-ENOMEM);
}
auto elf_image = ELF::Image(region->vaddr().as_ptr(), loader_metadata.size);
auto elf_image = ELF::Image(region->vaddr().as_ptr(), executable_size);
if (!elf_image.is_valid())
return KResult(-ENOEXEC);
@ -187,7 +188,7 @@ KResultOr<Process::LoadResult> Process::load_elf_object(FileDescription& object_
return LoadResult {
load_base_address,
elf_image.entry().offset(load_offset).get(),
(size_t)loader_metadata.size,
executable_size,
VirtualAddress(elf_image.program_header_table_offset()).offset(load_offset).get(),
elf_image.program_header_count(),
master_tls_region ? master_tls_region->make_weak_ptr() : nullptr,