qio: check for leaked blocks
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 3 Jun 2019 18:13:26 +0000 (14:13 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 3 Jun 2019 18:13:26 +0000 (14:13 -0400)
Whether a block is a singleton or a blocklist can be a little confusing.
This commit attempts to catch any freeb() calls on a block that is
actually part of a list.  So far, I haven't found any cases, so this is
merely precautionary.

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

index bd9b998..b2a7ed9 100644 (file)
@@ -231,6 +231,7 @@ size_t freeb(struct block *b)
                b->free(b);
                return ret;
        }
+       warn_on(b->next);
        /* poison the block in case someone is still holding onto it */
        b->next = dead;
        b->rp = dead;
index 1c41787..e7e5d01 100644 (file)
@@ -949,6 +949,7 @@ struct block *packblock(struct block *bp)
                        memmove((*l)->wp, nbp->rp, n);
                        (*l)->wp += n;
                        (*l)->next = nbp->next;
+                       nbp->next = NULL;
                        freeb(nbp);
                }
        }
@@ -1368,6 +1369,7 @@ struct block *bl2mem(uint8_t * p, struct block *b, int n)
                n -= i;
                p += i;
                next = b->next;
+               b->next = NULL;
                freeb(b);
        }
        return NULL;
@@ -1387,6 +1389,7 @@ static size_t read_all_blocks(struct block *b, void *va, size_t len)
                if (BLEN(b) && b->next)
                        panic("Failed to drain entire block (Qmsg?) but had a next!");
                next = b->next;
+               b->next = NULL;
                freeb(b);
                b = next;
        } while (b);