DragonFlyBSD Kernel Audit
DF-2798 / fix.diff
← back to finding ↓ download raw
--- 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);
 			}