Kmalloc canary debugging
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 16 Nov 2013 21:51:59 +0000 (13:51 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Jan 2014 19:42:53 +0000 (11:42 -0800)
This was originally used to fix a kmalloc bug in mntwalk.

The issue that pops up with any 9ns code doing its own walks was messing
up with the wq size:

- wq = kzmalloc(sizeof(struct walkqid) +
-       (nname - 1) * sizeof(struct qid), 0);
+ wq = kzmalloc(sizeof(struct walkqid) + (nname) * sizeof(struct qid),
+   KMALLOC_WAIT);

It seems that any plan9 walk is going to have the problem.  We had a
similar issue with devwalk, and it looked the same.  (Canary clobber in
namec for e.elems, and the clobber was due to a previous (in memory, not
in time) kmalloc).

kern/include/kmalloc.h
kern/src/kmalloc.c

index 10614a4..fd6776d 100644 (file)
@@ -21,6 +21,8 @@ void* (DALLOC(size) kmalloc)(size_t size, int flags);
 void* (DALLOC(size) kzmalloc)(size_t size, int flags);
 void* (DALLOC(size) krealloc)(void* buf, size_t size, int flags);
 void  (DFREE(addr) kfree)(void *addr);
+void kmalloc_canary_check(char *str);
+void *debug_canary;
 
 /* Flags */
 #define KMALLOC_TAG_CACHE 1
index dc52e4c..c1f14ef 100644 (file)
@@ -115,3 +115,12 @@ void kfree(void *addr)
                panic("[Italian Accent]: Che Cazzo! BO! Flag in kmalloc!!!");
 }
 
+void kmalloc_canary_check(char *str)
+{
+       if (!debug_canary)
+               return;
+       struct kmalloc_tag *tag = (struct kmalloc_tag*)(debug_canary -
+                                                       KMALLOC_OFFSET);
+       if (tag->canary != KMALLOC_CANARY)
+               panic("\t\t KMALLOC CANARY CHECK FAILED %s\n", str);
+}