From 4d192732ccd8ebf977029c17e49c9d1892f3b8d9 Mon Sep 17 00:00:00 2001 From: EnderIce2 Date: Tue, 19 Nov 2024 04:33:47 +0200 Subject: [PATCH] tasking: Check for null pointer first --- kernel_thread.cpp | 5 ++++- tasking/scheduler/custom.cpp | 4 ++++ tasking/task.cpp | 12 ++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/kernel_thread.cpp b/kernel_thread.cpp index 3b75f13..9b133fe 100644 --- a/kernel_thread.cpp +++ b/kernel_thread.cpp @@ -111,7 +111,10 @@ void KernelMainThread() initProc = TaskManager->GetProcessByID(tid); initThread = TaskManager->GetThreadByID(tid, initProc); TaskManager->WaitForThread(initThread); - ExitCode = initThread->GetExitCode(); + if (initThread) + ExitCode = initThread->GetExitCode(); + else + ExitCode = 0xEBAD; Exit: KPrint("\x1b[31mUserspace process exited with code %d (%#x)", ExitCode, ExitCode < 0 ? -ExitCode : ExitCode); diff --git a/tasking/scheduler/custom.cpp b/tasking/scheduler/custom.cpp index b88005e..62446ef 100644 --- a/tasking/scheduler/custom.cpp +++ b/tasking/scheduler/custom.cpp @@ -157,6 +157,9 @@ namespace Tasking::Scheduler TCB *Custom::GetThreadByID(TID ID, PCB *Parent) { + if (unlikely(Parent == nullptr)) + return nullptr; + foreach (auto t in Parent->Threads) { if (t->ID == ID) @@ -544,6 +547,7 @@ namespace Tasking::Scheduler { if (pcb->State.load() == TaskState::Terminated) { + debug("Found terminated process %s(%d)", pcb->Name, pcb->ID); delete pcb; continue; } diff --git a/tasking/task.cpp b/tasking/task.cpp index 279496f..937ff14 100644 --- a/tasking/task.cpp +++ b/tasking/task.cpp @@ -105,6 +105,9 @@ namespace Tasking void Task::WaitForProcess(PCB *pcb) { + if (pcb == nullptr) + return; + if (pcb->State == TaskState::UnknownStatus) return; @@ -119,6 +122,9 @@ namespace Tasking void Task::WaitForThread(TCB *tcb) { + if (tcb == nullptr) + return; + if (tcb->State == TaskState::UnknownStatus) return; @@ -133,6 +139,9 @@ namespace Tasking void Task::WaitForProcessStatus(PCB *pcb, TaskState status) { + if (pcb == nullptr) + return; + if (pcb->State == TaskState::UnknownStatus) return; @@ -145,6 +154,9 @@ namespace Tasking void Task::WaitForThreadStatus(TCB *tcb, TaskState status) { + if (tcb == nullptr) + return; + if (tcb->State == TaskState::UnknownStatus) return;