[Bug 264177] guest can cause a crash in bhyve nvme emulation
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 264177] bhyve: Guest can cause a crash in bhyve nvme emulation"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 264177] bhyve: Guest can cause a crash in bhyve nvme emulation"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 264177] bhyve: Guest can cause a crash in bhyve nvme emulation"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 264177] bhyve: Guest can cause a crash in bhyve nvme emulation"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 264177] bhyve: Guest can cause a crash in bhyve nvme emulation"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 264177] bhyve: Guest can cause a crash in bhyve nvme emulation"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 264177] bhyve: Guest can cause a crash in bhyve nvme emulation"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 264177] bhyve: Guest can cause a crash in bhyve nvme emulation"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 264177] bhyve: Guest can cause a crash in bhyve nvme emulation"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 264177] bhyve: Guest can cause a crash in bhyve nvme emulation"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 23 May 2022 15:10:14 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=264177 Bug ID: 264177 Summary: guest can cause a crash in bhyve nvme emulation Product: Base System Version: Unspecified Hardware: Any OS: Any Status: New Severity: Affects Some People Priority: --- Component: bhyve Assignee: virtualization@FreeBSD.org Reporter: rtm@lcs.mit.edu In bhyve's pci_nvme_append_iov_req(), if the guest provides a zero prp1 (i.e. gpaddr) for an I/O operation, then this code runs: if ((req->prev_gpaddr + req->prev_size) == gpaddr) { iovidx = req->io_req.br_iovcnt - 1; ...; req->prev_size += size; ...; req->io_req.br_iov[iovidx].iov_len = req->prev_size; prev_gpaddr, prev_size, and br_iovcnt are all ordinarily zero at this point. So iovidx = -1, and the assignment to br_iov[iovidx].iov_len actually overwrites io_req.br_param. This later causes a bad pointer dereference in pci_nvme_io_done(): struct pci_nvme_ioreq *req = br->br_param; struct nvme_submission_queue *sq = req->nvme_sq; You can see this happen if you boot a FreeBSD guest kernel in bhyve with an nvme device, after modifying the guest kernel's nvme_payload_map() in /sys/dev/nvme/nvme_qpair.c to set tr->req->cmd.prp1 to zero when it is called for the third time. -- You are receiving this mail because: You are the assignee for the bug.