From d728ff289123fff3443a897cca3fc6424634f536 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 4 Aug 2025 14:35:52 +0100 Subject: fix! PEFCodeMgr: critical fixes applied to PEF loader. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/PEFCodeMgr.cc | 61 ++++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 34 deletions(-) (limited to 'dev/kernel/src') diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index 71e4e232..d61a3cab 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -78,10 +78,9 @@ PEFLoader::PEFLoader(const Char* path) : fCachedBlob(nullptr), fFatBinary(false) container->Magic[3] == kPefMagic[3] && container->Magic[4] == kPefMagic[4] && container->Abi == kPefAbi) { return; - } else if (container->Magic[0] == kPefMagicFat[0] && - container->Magic[1] == kPefMagicFat[1] && container->Magic[2] == kPefMagicFat[2] && - container->Magic[3] == kPefMagicFat[3] && container->Magic[4] == kPefMagicFat[4] && - container->Abi == kPefAbi) { + } else if (container->Magic[0] == kPefMagicFat[0] && container->Magic[1] == kPefMagicFat[1] && + container->Magic[2] == kPefMagicFat[2] && container->Magic[3] == kPefMagicFat[3] && + container->Magic[4] == kPefMagicFat[4] && container->Abi == kPefAbi) { /// This is a fat binary, treat it as such. this->fFatBinary = true; return; @@ -111,9 +110,7 @@ PEFLoader::~PEFLoader() { /// @param kind kind of symbol we want. /***********************************************************************************/ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { - if (!fCachedBlob || fBad || !name) return ErrorOr{kErrorInvalidData}; - - PEFContainer* container = reinterpret_cast(fCachedBlob); + if (fBad || !name) return ErrorOr{kErrorInvalidData}; auto blob = fFile->Read(name, sizeof(PEFCommandHeader)); @@ -152,44 +149,40 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { } error_or_symbol.Leak().Leak() += name; - - for (SizeT index = 0; index < container->Count; ++index) { - if (KStringBuilder::Equals(container_header[index].Name, error_or_symbol.Leak().Leak().CData())) { - if (container_header[index].Kind == kind) { - if (container_header[index].Cpu != Detail::ldr_get_platform()) { - if (!this->fFatBinary) { - mm_free_ptr(blob); - return ErrorOr{kErrorInvalidData}; - } + if (KStringBuilder::Equals(container_header->Name, error_or_symbol.Leak().Leak().CData())) { + if (container_header->Kind == kind) { + if (container_header->Cpu != Detail::ldr_get_platform()) { + if (!this->fFatBinary) { + mm_free_ptr(blob); + return ErrorOr{kErrorInvalidData}; } + } - Char* container_blob_value = new Char[container_header[index].VMSize]; + Char* container_blob_value = new Char[container_header->VMSize]; - rt_copy_memory_safe((VoidPtr) ((Char*) blob + sizeof(PEFCommandHeader)), - container_blob_value, container_header[index].VMSize, - container_header[index].VMSize); + rt_copy_memory_safe((VoidPtr) ((Char*) blob + sizeof(PEFCommandHeader)), container_blob_value, + container_header->VMSize, container_header->VMSize); - mm_free_ptr(blob); + mm_free_ptr(blob); - kout << "PEFLoader: info: Loaded stub: " << container_header[index].Name << "!\r"; + kout << "PEFLoader: info: Loaded stub: " << container_header->Name << "!\r"; - auto ret = 0; + auto ret = 0; - auto pages_count = (container_header[index].VMSize + kPageSize - 1) / kPageSize; + auto pages_count = (container_header->VMSize + kPageSize - 1) / kPageSize; - for (SizeT i_vm{}; i_vm < pages_count; ++i_vm) { - ret = HAL::mm_map_page((VoidPtr) (container_header[index].VMAddress + (i_vm * kPageSize)), - (VoidPtr) HAL::mm_get_page_addr(container_blob_value), - HAL::kMMFlagsPresent | HAL::kMMFlagsUser); + for (SizeT i_vm{}; i_vm < pages_count; ++i_vm) { + ret = HAL::mm_map_page((VoidPtr) (container_header->VMAddress + (i_vm * kPageSize)), + (VoidPtr) HAL::mm_get_page_addr(container_blob_value), + HAL::kMMFlagsPresent | HAL::kMMFlagsUser); - if (ret != kErrorSuccess) { - delete[] container_blob_value; - return ErrorOr{kErrorInvalidData}; - } + if (ret != kErrorSuccess) { + delete[] container_blob_value; + return ErrorOr{kErrorInvalidData}; } - - return ErrorOr{container_blob_value}; } + + return ErrorOr{container_blob_value}; } } -- cgit v1.2.3