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

[Lost] [Patch] kernel2: Platz auf dem Stack schaffen für Syscalls



! kernel2: Wenn der Userspace in einen Stackoverflow rennt, können wir das 
mittlerweile abfangen und den Stack einfach vergroessern. Wenn es beim Kernel 
passiert, rennen wir in einen Triple Fault. Dadurch, dass bei Syscalls der 
Userspace-Stack benutzt wird, kann aber genau letzteres passieren, wenn der 
Userspace-Thread gerade seinen Stack fast voll hatte. Um das zu vermeiden, 
werden mit diesen Patch 512 Bytes Luft geschaffen für den Syscall.
Index: trunk/src/kernel2/src/arch/i386/syscall.c
===================================================================
--- trunk.orig/src/kernel2/src/arch/i386/syscall.c
+++ trunk/src/kernel2/src/arch/i386/syscall.c
@@ -9,6 +9,10 @@
 
 #define DEBUG_SYSCALLS 1
 
+#if CONFIG_ARCH == ARCH_I386
+void increase_user_stack_size(pm_thread_t* task_ptr, int pages);
+#endif
+
 #if 0
 // Neues Syscall-Interface
 void syscall_arch(machine_state_t* isf)
@@ -91,6 +95,15 @@ void syscall_arch(machine_state_t* isf)
         uint32_t eax, edx;
         dword stack_backup;
 
+
+        // 512 Bytes Sicherheitsabstand auf dem Stack, denn wenn der Kernel
+        // hier einen Stack Overflow produziert, haben wir ein Problem.
+        if ((void*) (isf->esp - 0x200) <
+            cpu_get_current()->thread->user_stack_bottom)
+        {
+            increase_user_stack_size(cpu_get_current()->thread, 1);
+        }
+
          // Die Syscallhandler werden mit dem Userspace-Stack aufgerufen, damit
         // keine Parameter kopiert werden muessen.
         asm("pusha;"