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

[Lost] [Patch] bool-Rückgabe in mem_free



Der Kernel gibt mit diesem Patch einen boolean in SYSCALL_MEM_FREE zurück. Standardverhalten bei Fehlern ist jetzt, FALSE zurückzugeben. abort_task wird nur noch bei gesetztem debug=p (PEDANTIC) ausgeführt.
Index: src/kernel/src/syscall.c
===================================================================
--- src/kernel/src/syscall.c	(Revision 618)
+++ src/kernel/src/syscall.c	(Arbeitskopie)
@@ -33,6 +33,8 @@
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */  
 
+#include <stdint.h>
+
 #include "console.h"
 #include "syscall.h"
 #include "kprintf.h"
@@ -65,6 +67,22 @@
 dword debug_last_syscall_data[DEBUG_LAST_SYSCALL_DATA_SIZE] = { 0 };
 #endif 
 
+/**
+ * Prueft, ob ein Speicherbereich komplett gemappt ist und PTE_U gesetzt
+ * hat.
+ *
+ * FIXME Tut sie in dieser Form natuerlich nicht
+ */
+bool is_userspace(vaddr_t start, dword len)
+{
+    if (start + len < start) {
+        return FALSE;
+    }
+
+    return ((uintptr_t) start >= USER_MEM_START) 
+        && ((uintptr_t) start + len <= USER_MEM_END);
+}
+
 void syscall(struct int_stack_frame ** esp) 
 {
     struct int_stack_frame * isf = *esp;
@@ -197,9 +215,26 @@
 
             if((dword)address % PAGE_SIZE != 0)
             {
-                abort_task("SYSCALL_MEM_FREE: Der Task versucht eine nicht ausgerichtete Adresse freizugeben: 0x%08x", address);
+                if (debug_test_flag(DEBUG_FLAG_PEDANTIC)) {
+                    abort_task("SYSCALL_MEM_FREE: Der Task versucht eine "
+                        "nicht ausgerichtete Adresse freizugeben: 0x%08x", 
+                        address);
+                }
+                isf->eax = FALSE;
+                break;
             }
 
+            if (!is_userspace(address, pages * PAGE_SIZE)) 
+            {
+                if (debug_test_flag(DEBUG_FLAG_PEDANTIC)) {
+                    abort_task("SYSCALL_MEM_FREE: Der Task versucht eine "
+                        "Adresse freizugeben, die nicht fuer ihn reserviert "
+                        "ist: 0x%08x (+0x%x)", address, pages * PAGE_SIZE);
+                }
+                isf->eax = FALSE;
+                break;
+            }
+
             for (; pages; pages--) {
                 paddr_t paddress = resolve_vaddr((page_directory_t) current_task->cr3, address);
 
@@ -215,6 +250,7 @@
                 address += PAGE_SIZE;
             }
 
+            isf->eax = TRUE;
             break;
         }
         
Index: src/modules/include/syscall.h
===================================================================
--- src/modules/include/syscall.h	(Revision 618)
+++ src/modules/include/syscall.h	(Arbeitskopie)
@@ -23,7 +23,7 @@
 void* mem_allocate(dword size, dword flags);
 void *mem_allocate_physical(dword size, dword position, dword flags);
 dma_mem_ptr_t mem_dma_allocate(dword size, dword flags);
-void mem_free(void* address, dword size);
+bool mem_free(void* address, dword size);
 void mem_free_physical(void* address, dword size);
 memory_info_t memory_info();
 
Index: src/modules/lib/syscalls/mem_allocate.c
===================================================================
--- src/modules/lib/syscalls/mem_allocate.c	(Revision 618)
+++ src/modules/lib/syscalls/mem_allocate.c	(Arbeitskopie)
@@ -39,15 +39,18 @@
     return ptr.virt;
 }
 
-void mem_free(void* address, dword size)
+bool mem_free(void* address, dword size)
 {
+    dword result;
     asm(
+        "pushl %3;"
         "pushl %2;"
-        "pushl %1;"
-        "mov %0, %%eax;"
+        "mov %1, %%eax;"
         "int $0x30;"
         "add $0x8, %%esp;"
-    : : "i" (SYSCALL_MEM_FREE), "r" (address), "r" (size));
+    : "=a" (result) : "i" (SYSCALL_MEM_FREE), "r" (address), "r" (size));
+
+    return result;
 }
 
 void mem_free_physical(void* address, dword size)