Checking in malloc/free for double frees. Debug printf can now be called from any...
authorAdam Turowski <adam.turowski@inf.ethz.ch>
Mon, 25 Jul 2016 12:53:29 +0000 (14:53 +0200)
committerAdam Turowski <adam.turowski@inf.ethz.ch>
Mon, 25 Jul 2016 12:53:29 +0000 (14:53 +0200)
Signed-off-by: Adam Turowski <adam.turowski@inf.ethz.ch>

include/k_r_malloc.h
lib/barrelfish/debug.c
lib/newlib/newlib/libc/sys/barrelfish/oldmalloc.c

index 9488030..ce90bf6 100644 (file)
@@ -12,6 +12,7 @@ typedef long long Align;      /* for alignment to long long boundary */
 union header {                 /* block header */
        struct {
                union header   *ptr;    /* next block if on free list */
+               unsigned                magic;  /* to mark malloced region */
                unsigned        size;   /* size of this block */
        } s;
        Align           x;      /* force alignment of blocks */
index 7753426..94776c3 100644 (file)
@@ -111,12 +111,16 @@ errval_t debug_dump_hw_ptables(void)
 
 void debug_printf(const char *fmt, ...)
 {
+    struct thread *me = thread_self();
     va_list argptr;
+    char id[32] = "-";
     char str[256];
     size_t len;
 
-    len = snprintf(str, sizeof(str), "\033[34m%.*s.\033[31m%u.%"PRIuPTR"\033[0m: ",
-                   DISP_NAME_LEN, disp_name(), disp_get_core_id(), thread_id());
+    if (me)
+        snprintf(id, sizeof(id), "%"PRIuPTR, thread_get_id(me));
+    len = snprintf(str, sizeof(str), "\033[34m%.*s.\033[31m%u.%s\033[0m: ",
+                   DISP_NAME_LEN, disp_name(), disp_get_core_id(), id);
     if (len < sizeof(str)) {
         va_start(argptr, fmt);
         vsnprintf(str + len, sizeof(str) - len, fmt, argptr);
index c3c95e3..de9088f 100644 (file)
@@ -61,6 +61,7 @@ malloc(size_t nbytes)
                                p += p->s.size;
                                p->s.size = nunits;
                        }
+            p->s.magic = 0xdeadbeef;
                        state->header_freep = prevp;
 #ifdef CONFIG_MALLOC_DEBUG
                        {
@@ -173,6 +174,11 @@ void free(void *ap)
     assert((lvaddr_t)ap >= base && (lvaddr_t)ap < limit);
 #endif
 
+    if (((Header *)ap)[-1].s.magic != 0xdeadbeef) {
+        debug_printf("%s: Trying to free not malloced region: %p\n", __func__, ap);
+        return;
+    }
+    ((Header *)ap)[-1].s.magic = 0;
     MALLOC_LOCK;
     __free_locked(ap);
     lesscore();