Module Name: src Committed By: isaki Date: Sat Mar 9 11:55:59 UTC 2024
Modified Files: src/sys/dev/virtio: virtio_mmio.c Log Message: Fix a null dereference (on attach failure). During cleanup, setup_queue may be called even before vsc->sc_vqs is assigned. To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/sys/dev/virtio/virtio_mmio.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/virtio/virtio_mmio.c diff -u src/sys/dev/virtio/virtio_mmio.c:1.13 src/sys/dev/virtio/virtio_mmio.c:1.14 --- src/sys/dev/virtio/virtio_mmio.c:1.13 Sat Jan 6 06:59:33 2024 +++ src/sys/dev/virtio/virtio_mmio.c Sat Mar 9 11:55:59 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: virtio_mmio.c,v 1.13 2024/01/06 06:59:33 thorpej Exp $ */ +/* $NetBSD: virtio_mmio.c,v 1.14 2024/03/09 11:55:59 isaki Exp $ */ /* $OpenBSD: virtio_mmio.c,v 1.2 2017/02/24 17:12:31 patrick Exp $ */ /*- @@ -58,7 +58,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: virtio_mmio.c,v 1.13 2024/01/06 06:59:33 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: virtio_mmio.c,v 1.14 2024/03/09 11:55:59 isaki Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -208,8 +208,7 @@ virtio_mmio_v2_setup_queue(struct virtio uint64_t addr) { struct virtio_mmio_softc *sc = (struct virtio_mmio_softc *)vsc; - struct virtqueue *vq = &vsc->sc_vqs[idx]; - KASSERT(vq->vq_index == idx); + struct virtqueue *vq; virtio_mmio_reg_write(sc, VIRTIO_MMIO_QUEUE_SEL, idx); if (addr == 0) { @@ -218,6 +217,9 @@ virtio_mmio_v2_setup_queue(struct virtio virtio_mmio_v2_set_addr(sc, VIRTIO_MMIO_V2_QUEUE_AVAIL_LOW, 0); virtio_mmio_v2_set_addr(sc, VIRTIO_MMIO_V2_QUEUE_USED_LOW, 0); } else { + vq = &vsc->sc_vqs[idx]; + KASSERT(vq->vq_index == idx); + virtio_mmio_reg_write(sc, VIRTIO_MMIO_QUEUE_NUM, virtio_mmio_reg_read(sc, VIRTIO_MMIO_QUEUE_NUM_MAX)); virtio_mmio_v2_set_addr(sc, VIRTIO_MMIO_V2_QUEUE_DESC_LOW,