summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-06-10 16:24:48 +0200
committerAmlal El Mahrouss <amlal@nekernel.org>2025-06-10 16:24:54 +0200
commit6862d802a882d989e36fee2b0aa200391d948f16 (patch)
treee53809838a030fdc2275889aaaf40bfd8d11b14f /dev
parentf0f5c992ff0216e2e33f84751d5a389ebfb017b8 (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.h2
-rw-r--r--dev/kernel/src/UserProcessScheduler.cc40
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;