HomeFreeBSD

nvme: Fix memory leak in pt ioctl commands

Description

nvme: Fix memory leak in pt ioctl commands

When running nvme passthrough commands through the ioctl interface
memory is mapped with vmapbuf() but not unmapped. This results in leaked
memory whenever a process executes an nvme passthrough command with a
data buffer. This can be replicated with a simple c function (error
checks skipped for brevity):

void leak_memory(int nvme_ns_fd, uint16_t nblocks) {
struct nvme_pt_command pt = {

		.cmd = {
			.opc = NVME_OPC_READ,
			.cdw12 = nblocks - 1,
		},
		.len = nblocks * 512, // Assumes devices with 512 byte lba
		.is_read = 1, // Reads and writes should both trigger leak

}
void *buf;

posix_memalign(&buf, nblocks * 512);
pt.buf = buf;
ioctl(nvme_ns_fd, NVME_PASSTHROUGH_COMMAND, &pt);
free(buf);
}

Signed-off-by: David Sloan <david.sloan@eideticom.com>

PR: 273626
Reviewed by: imp, markj
MFC after: 1 week

Details

Provenance
David Sloan <david.sloan@eideticom.com>Authored on Sep 7 2023, 4:22 PM
markjCommitted on Oct 2 2023, 3:50 PM
Parents
rGf156cd892b55: net80211 / drivers: remove public use of ieee80211_node_incref()
Branches
Unknown
Tags
Unknown