CVE-2025-38658

In the Linux kernel, the following vulnerability has been resolved: nvmet: pci-epf: Do not complete commands twice if nvmet_req_init() fails Have nvmet_req_init() and req->execute() complete failed commands. Description of the problem: nvmet_req_init() calls __nvmet_req_complete() internally upon failure, e.g., unsupported opcode, which calls the "queue_response" callback, this results in nvmet_pci_epf_queue_response() being called, which will call nvmet_pci_epf_complete_iod() if data_len is 0 or if dma_dir is different from DMA_TO_DEVICE. This results in a double completion as nvmet_pci_epf_exec_iod_work() also calls nvmet_pci_epf_complete_iod() when nvmet_req_init() fails. Steps to reproduce: On the host send a command with an unsupported opcode with nvme-cli, For example the admin command "security receive" $ sudo nvme security-recv /dev/nvme0n1 -n1 -x4096 This triggers a double completion as nvmet_req_init() fails and nvmet_pci_epf_queue_response() is called, here iod->dma_dir is still in the default state of "DMA_NONE" as set by default in nvmet_pci_epf_alloc_iod(), so nvmet_pci_epf_complete_iod() is called. Because nvmet_req_init() failed nvmet_pci_epf_complete_iod() is also called in nvmet_pci_epf_exec_iod_work() leading to a double completion. This not only sends two completions to the host but also corrupts the state of the PCI NVMe target leading to kernel oops. This patch lets nvmet_req_init() and req->execute() complete all failed commands, and removes the double completion case in nvmet_pci_epf_exec_iod_work() therefore fixing the edge cases where double completions occurred.
Configurations

Configuration 1 (hide)

cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*

History

26 Nov 2025, 16:32

Type Values Removed Values Added
First Time Linux
Linux linux Kernel
References () https://git.kernel.org/stable/c/746d0ac5a07d5da952ef258dd4d75f0b26c96476 - () https://git.kernel.org/stable/c/746d0ac5a07d5da952ef258dd4d75f0b26c96476 - Patch
References () https://git.kernel.org/stable/c/a535c0b10060bc8c174a7964b0f98064ee0c4774 - () https://git.kernel.org/stable/c/a535c0b10060bc8c174a7964b0f98064ee0c4774 - Patch
CPE cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
CVSS v2 : unknown
v3 : unknown
v2 : unknown
v3 : 5.5
CWE CWE-908
Summary
  • (es) En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: nvmet: pci-epf: No completar comandos dos veces si nvmet_req_init() falla. nvmet_req_init() y req->execute() completan los comandos fallidos. Descripción del problema: nvmet_req_init() llama internamente a __nvmet_req_complete() en caso de fallo (p. ej., un código de operación no compatible, que llama a la devolución de llamada "queue_response"). Esto provoca la llamada a nvmet_pci_epf_queue_response(), que a su vez llama a nvmet_pci_epf_complete_iod() si data_len es 0 o si dma_dir es diferente de DMA_TO_DEVICE. Esto genera una doble finalización, ya que nvmet_pci_epf_exec_iod_work() también llama a nvmet_pci_epf_complete_iod() cuando falla nvmet_req_init(). Pasos para reproducir: En el host, envíe un comando con un código de operación no compatible con nvme-cli. Por ejemplo, el comando de administrador "security receive": $ sudo nvme security-recv /dev/nvme0n1 -n1 -x4096. Esto activa una doble finalización, ya que nvmet_req_init() falla y se llama a nvmet_pci_epf_queue_response(). En este caso, iod->dma_dir aún se encuentra en el estado predeterminado "DMA_NONE", tal como se establece por defecto en nvmet_pci_epf_alloc_iod(), por lo que se llama a nvmet_pci_epf_complete_iod(). Debido a que nvmet_req_init() falló, nvmet_pci_epf_complete_iod() también se llama en nvmet_pci_epf_exec_iod_work(), lo que provoca una doble finalización. Esto no solo envía dos finalizaciones al host, sino que también corrompe el estado del destino PCI NVMe, lo que provoca errores del kernel. Este parche permite que nvmet_req_init() y req->execute() completen todos los comandos fallidos y elimina el caso de doble finalización en nvmet_pci_epf_exec_iod_work(), corrigiendo así los casos extremos donde se producían dobles finalizaciones.

22 Aug 2025, 16:15

Type Values Removed Values Added
New CVE

Information

Published : 2025-08-22 16:15

Updated : 2025-11-26 16:32


NVD link : CVE-2025-38658

Mitre link : CVE-2025-38658

CVE.ORG link : CVE-2025-38658


JSON object : View

Products Affected

linux

  • linux_kernel
CWE
CWE-908

Use of Uninitialized Resource