[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH] kernel2: Panic im Int-Handler, falls isf nicht auf kernel-Stack



! kernel2: Wenn im Kernel beispielsweise erst current_thread angepasst
           wird, und danach direkt ein yield ausgefuehrt wird, kann das
	   dazu fuehren, dass ein Thread einen falschen kernel-Stack
           benutzt. Statt dann einfach irgendwann mit seltsamen Meldungen
           abzustuerzen loesen wir lieber einen Panic aus.

Signed-off-by: Antoine Kaufmann <toni@xxxxxxxxxx>
---
 src/kernel2/src/interrupts/im.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/src/kernel2/src/interrupts/im.c b/src/kernel2/src/interrupts/im.c
index 57e260f..770f351 100644
--- a/src/kernel2/src/interrupts/im.c
+++ b/src/kernel2/src/interrupts/im.c
@@ -135,6 +135,15 @@ interrupt_stack_frame_t* im_handler(interrupt_stack_frame_t* isf)
     pm_thread_t* old_thread = thread;
     uint8_t int_num = isf->interrupt_number;
     interrupt_stack_frame_t* new_isf = isf;
+    uintptr_t isf_addr = (uintptr_t) isf;
+
+    if ((isf_addr < (uintptr_t) thread->kernel_stack_bottom) ||
+        (isf_addr >=
+        ((uintptr_t) thread->kernel_stack_bottom + thread->kernel_stack_size)))
+    {
+        panic("Stackframe von Interrupt liegt ausserhalb des Kernelstacks des "
+            "aktuellen Threads. (pm_scheduler_yield() nach Thread-Wechsel?)");
+    }
 
     // Wenn der Int aus dem Userspace kommt, legen wir den zugehoerigen ISF ab
     if (isf->cs != 0x8) {
-- 
1.6.4.4