arena: warn instead of panic for free-checks
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 23 Sep 2019 20:29:15 +0000 (16:29 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 8 Oct 2019 21:11:11 +0000 (17:11 -0400)
These checks are signs of bugs, but we can proceed by just returning.
For the size-mismatch, we could try and free the correct size, but since
there is some bug, we should be safe and just not free anything.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/arena.c

index b51bd4e..ca624aa 100644 (file)
@@ -1135,12 +1135,16 @@ static void free_from_arena(struct arena *arena, void *addr, size_t size)
 
        spin_lock_irqsave(&arena->lock);
        bt = __untrack_alloc_seg(arena, (uintptr_t)addr);
-       if (!bt)
-               panic("Free of unallocated addr %p from arena %s", addr,
-                     arena->name);
-       if (bt->size != size)
-               panic("Free of %p with wrong size %p (%p) from arena %s", addr,
+       if (!bt) {
+               warn("Free of unallocated addr %p size %p from arena %s", addr,
+                    arena->name, size);
+               return;
+       }
+       if (bt->size != size) {
+               warn("Free of %p with wrong size %p (%p) from arena %s", addr,
                      size, bt->size, arena->name);
+               return;
+       }
        arena->amt_alloc_segs -= size;
        __track_free_seg(arena, bt);
        __coalesce_free_seg(arena, bt, &to_free_addr, &to_free_sz);