--- a/sys/kern/subr_alist.c +++ b/sys/kern/subr_alist.c @@ -164,7 +164,7 @@ bl->bl_rootblks = 1 + alst_radix_init(NULL, 0, bl->bl_radix, bl->bl_skip, blocks); bl->bl_root = kmalloc(sizeof(almeta_t) * bl->bl_rootblks, - mtype, M_WAITOK); + mtype, M_WAITOK | M_ZERO); #if defined(ALIST_DEBUG) kprintf( @@ -283,7 +283,9 @@ alist_free(alist_t bl, alist_blk_t blkno, alist_blk_t count) { if (bl) { - KKASSERT(blkno + count <= bl->bl_blocks); + if (blkno + count > bl->bl_blocks) + panic("%s: free %u+%u beyond limit of %u", + __func__, blkno, count, bl->bl_blocks); if (bl->bl_radix == ALIST_BMAP_RADIX) { alst_leaf_free(bl->bl_root, blkno, count); } else { @@ -556,7 +558,8 @@ mask = (alist_bmap_t)-1 >> (ALIST_BMAP_RADIX - n); for (j = 0; j < ALIST_META_RADIX; j += n / 2) { if ((scan->bm_bitmap & mask) == mask && - blk + j * radix >= start) { + blk + j * radix >= start && + blk + j * radix + count <= bl->bl_blocks) { scan->bm_bitmap &= ~mask; return(blk + j * radix); }