[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;"