bhyve: validate NVMe deallocate range values

For NVMe emulation, validate the Data Set Management LBA ranges do not
exceed the capacity of the backing storage. If they do, return an "LBA
Out of Range" error.

Fixes UNH Test 2.2.3

Tested by:	Jason Tubnor
MFC after:	2 weeks
Differential Revision: https://reviews.freebsd.org/D24893
This commit is contained in:
Chuck Tuffli 2020-06-29 00:31:58 +00:00
parent 73cd73c0b8
commit ae638f2bd5
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=362758

View File

@ -1877,6 +1877,11 @@ nvme_opc_dataset_mgmt(struct pci_nvme_softc *sc,
nvme_prp_memcpy(sc->nsc_pi->pi_vmctx, cmd->prp1, cmd->prp2,
(uint8_t *)range, NVME_MAX_DSM_TRIM, NVME_COPY_FROM_PRP);
if ((range[0].starting_lba * sectsz) > nvstore->size) {
pci_nvme_status_genc(status, NVME_SC_LBA_OUT_OF_RANGE);
goto out;
}
/*
* If the request is for more than a single range, store
* the ranges in the br_iov. Optimize for the common case
@ -1896,6 +1901,10 @@ nvme_opc_dataset_mgmt(struct pci_nvme_softc *sc,
struct iovec *iov = req->io_req.br_iov;
for (r = 0; r <= nr; r++) {
if ((range[r].starting_lba * sectsz) > nvstore->size) {
pci_nvme_status_genc(status, NVME_SC_LBA_OUT_OF_RANGE);
goto out;
}
iov[r].iov_base = (void *)(range[r].starting_lba * sectsz);
iov[r].iov_len = range[r].length * sectsz;
}