The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=5ae9f8e9ac5e1307fed4f7f2549347576f01b3fa
commit 5ae9f8e9ac5e1307fed4f7f2549347576f01b3fa Author: Mark Johnston <ma...@freebsd.org> AuthorDate: 2025-07-03 13:10:49 +0000 Commit: Mark Johnston <ma...@freebsd.org> CommitDate: 2025-07-03 15:10:41 +0000 md: Restore guards in mddestroy() mddestroy() may be invoked on a partially constructed md device. Restore the guards that handled this prior to commit e91022168101. Reported by: syzbot+a0ff73f664de8757c...@syzkaller.appspotmail.com Reported by: syzbot+7b4a4824bf8154828...@syzkaller.appspotmail.com Reviewed by: kib Fixes: e91022168101 ("md(4): move type-specific data under union") Differential Revision: https://reviews.freebsd.org/D51145 --- sys/dev/md/md.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c index b842d4f2fd8e..741a7c013f7d 100644 --- a/sys/dev/md/md.c +++ b/sys/dev/md/md.c @@ -1559,19 +1559,26 @@ mddestroy(struct md_s *sc, struct thread *td) mtx_destroy(&sc->queue_mtx); switch (sc->type) { case MD_VNODE: - vn_lock(sc->s_vnode.vnode, LK_EXCLUSIVE | LK_RETRY); - sc->s_vnode.vnode->v_vflag &= ~VV_MD; - VOP_UNLOCK(sc->s_vnode.vnode); - (void)vn_close(sc->s_vnode.vnode, sc->flags & MD_READONLY ? - FREAD : (FREAD|FWRITE), sc->cred, td); - kva_free(sc->s_vnode.kva, maxphys + PAGE_SIZE); + if (sc->s_vnode.vnode != NULL) { + vn_lock(sc->s_vnode.vnode, LK_EXCLUSIVE | LK_RETRY); + sc->s_vnode.vnode->v_vflag &= ~VV_MD; + VOP_UNLOCK(sc->s_vnode.vnode); + (void)vn_close(sc->s_vnode.vnode, + sc->flags & MD_READONLY ? FREAD : (FREAD|FWRITE), + sc->cred, td); + } + if (sc->s_vnode.kva != 0) + kva_free(sc->s_vnode.kva, maxphys + PAGE_SIZE); break; case MD_SWAP: - vm_object_deallocate(sc->s_swap.object); + if (sc->s_swap.object != NULL) + vm_object_deallocate(sc->s_swap.object); break; case MD_MALLOC: - destroy_indir(sc, sc->s_malloc.indir); - uma_zdestroy(sc->s_malloc.uma); + if (sc->s_malloc.indir != NULL) + destroy_indir(sc, sc->s_malloc.indir); + if (sc->s_malloc.uma != NULL) + uma_zdestroy(sc->s_malloc.uma); break; case MD_PRELOAD: case MD_NULL: