From ae10b503726e8a125298f3588806a87d3772e6eb Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sat, 18 May 2013 17:49:05 +0800 Subject: [PATCH] Kernel/threads - Fixed infinite fault loop if thread/proces pointer is bad --- KernelLand/Kernel/threads.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/KernelLand/Kernel/threads.c b/KernelLand/Kernel/threads.c index 0961f8d2..67a2f637 100644 --- a/KernelLand/Kernel/threads.c +++ b/KernelLand/Kernel/threads.c @@ -1133,9 +1133,20 @@ char **Threads_GetCWD(void) void Threads_int_DumpThread(tThread *thread) { + if( !thread ) { + Log(" %p NULL", thread); + return ; + } + if( !CheckMem(thread, sizeof(tThread)) ) { + Log(" %p INVAL", thread); + return ; + } + tPID pid = (thread->Process ? thread->Process->PID : -1); + const char *statstr = (thread->Status < sizeof(casTHREAD_STAT)/sizeof(casTHREAD_STAT[0]) + ? casTHREAD_STAT[thread->Status] : ""); Log(" %p %i (%i) - %s (CPU %i) - %i (%s)", - thread, thread->TID, thread->Process->PID, thread->ThreadName, thread->CurCPU, - thread->Status, casTHREAD_STAT[thread->Status] + thread, thread->TID, pid, thread->ThreadName, thread->CurCPU, + thread->Status, statstr ); switch(thread->Status) { @@ -1149,6 +1160,9 @@ void Threads_int_DumpThread(tThread *thread) ((tSemaphore*)thread->WaitPointer)->Name ); break; + case THREAD_STAT_EVENTSLEEP: + // TODO: Event mask + break; case THREAD_STAT_ZOMBIE: Log(" Return Status: %i", thread->RetStatus); break; @@ -1200,13 +1214,11 @@ void Threads_DumpActive(void) */ void Threads_Dump(void) { - tThread *thread; - Log("--- Thread Dump ---"); Threads_DumpActive(); Log("All Threads:"); - for(thread=gAllThreads;thread;thread=thread->GlobalNext) + for(tThread *thread = gAllThreads; thread; thread = thread->GlobalNext) { Threads_int_DumpThread(thread); } -- 2.20.1