diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-06-10 16:24:48 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2025-06-10 16:24:54 +0200 |
| commit | 6862d802a882d989e36fee2b0aa200391d948f16 (patch) | |
| tree | e53809838a030fdc2275889aaaf40bfd8d11b14f /dev | |
| parent | f0f5c992ff0216e2e33f84751d5a389ebfb017b8 (diff) | |
fix: UserProcessScheduler security patches.
These patches are regarding:
- Thread safety (exit code global has been removed.)
- Code quality, in `SpawnDylib`
- In memory allocation checks too.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev')
| -rw-r--r-- | dev/kernel/KernelKit/UserProcessScheduler.h | 2 | ||||
| -rw-r--r-- | dev/kernel/src/UserProcessScheduler.cc | 40 |
2 files changed, 21 insertions, 21 deletions
diff --git a/dev/kernel/KernelKit/UserProcessScheduler.h b/dev/kernel/KernelKit/UserProcessScheduler.h index 7c994726..5bc5b8d2 100644 --- a/dev/kernel/KernelKit/UserProcessScheduler.h +++ b/dev/kernel/KernelKit/UserProcessScheduler.h @@ -228,8 +228,6 @@ class UserProcessHelper final { STATIC ErrorOr<PID> TheCurrentPID(); STATIC SizeT StartScheduling(); }; - -const UInt32& sched_get_exit_code(void) noexcept; } // namespace Kernel #include <KernelKit/ThreadLocalStorage.h> diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index e417cc8d..6753b238 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -25,12 +25,6 @@ ///! BUGS: 0 namespace Kernel { -/***********************************************************************************/ -/// @brief Exit Code global variable. -/***********************************************************************************/ - -STATIC UInt32 kLastExitCode = 0U; - USER_PROCESS::USER_PROCESS() = default; USER_PROCESS::~USER_PROCESS() = default; @@ -38,10 +32,6 @@ USER_PROCESS::~USER_PROCESS() = default; /// @note Not thread-safe. /// @return Int32 the last exit code. -const UInt32& sched_get_exit_code(void) noexcept { - return kLastExitCode; -} - /***********************************************************************************/ /// @brief Crashes the current process. /***********************************************************************************/ @@ -135,6 +125,11 @@ ErrorOr<VoidPtr> USER_PROCESS::New(SizeT sz, SizeT pad_amount) { if (!this->HeapTree) { this->HeapTree = new PROCESS_HEAP_TREE<VoidPtr>(); + if (!this->HeapTree) { + this->Crash(); + return ErrorOr<VoidPtr>(-kErrorHeapOutOfMemory); + } + this->HeapTree->EntryPad = pad_amount; this->HeapTree->EntrySize = sz; @@ -173,6 +168,11 @@ ErrorOr<VoidPtr> USER_PROCESS::New(SizeT sz, SizeT pad_amount) { auto new_entry = new PROCESS_HEAP_TREE<VoidPtr>(); + if (!new_entry) { + this->Crash(); + return ErrorOr<VoidPtr>(-kErrorHeapOutOfMemory); + } + new_entry->Entry = ptr; new_entry->EntrySize = sz; new_entry->EntryPad = pad_amount; @@ -262,8 +262,6 @@ Void USER_PROCESS::Exit(const Int32& exit_code) { this->LastExitCode = exit_code; this->UTime = 0; - kLastExitCode = exit_code; - --this->ParentTeam->mProcessCur; auto memory_ptr_list = this->HeapTree; @@ -322,7 +320,7 @@ Void USER_PROCESS::Exit(const Int32& exit_code) { /***********************************************************************************/ Bool USER_PROCESS::SpawnDylib() { - // React according to process kind. + // React according to the process's kind. switch (this->Kind) { case USER_PROCESS::kExecutableDylibKind: { this->DylibDelegate = rtl_init_dylib_pef(*this); @@ -338,11 +336,15 @@ Bool USER_PROCESS::SpawnDylib() { return NO; } default: { - (Void)(kout << "Unknown process kind: " << hex_number(this->Kind) << kendl); - this->Crash(); - return NO; + break; } } + + (Void)(kout << "Unknown process kind: " << hex_number(this->Kind) << kendl); + this->Crash(); + return NO; + + return NO; } /***********************************************************************************/ @@ -507,11 +509,11 @@ SizeT UserProcessScheduler::Run() noexcept { // We add a bigger cooldown according to the RTime and affinity here. if (process.PTime < process.RTime && AffinityKind::kRealTime != process.Affinity) { if (process.RTime < (Int32) AffinityKind::kVeryHigh) - process.RTime = (Int32) AffinityKind::kLowUsage / 2; + process.RTime += (Int32) AffinityKind::kLowUsage; else if (process.RTime < (Int32) AffinityKind::kHigh) - process.RTime = (Int32) AffinityKind::kStandard / 3; + process.RTime += (Int32) AffinityKind::kStandard; else if (process.RTime < (Int32) AffinityKind::kStandard) - process.RTime = (Int32) AffinityKind::kHigh / 4; + process.RTime += (Int32) AffinityKind::kHigh; process.PTime -= process.RTime; process.RTime = 0UL; |
