From ea8314e4402f6c385b6e41e4f7803853e64e421b Mon Sep 17 00:00:00 2001 From: Brijesh Singh Date: Wed, 30 Aug 2017 12:28:29 -0400 Subject: [PATCH] OvmfPkg/VirtioBlkDxe: Check the return status of unmap data buffer when "RequestIsWrite" is FALSE -- i.e., the CPU wants data from the device, we map "Buffer" for VirtioOperationBusMasterWrite. In this case, checking the return status of Dev->VirtIo->UnmapSharedBuffer (Dev->VirtIo, BufferMapping); is must. If the unmapping fails, then "Buffer" will not contain the actual data from the device, and we must fail the request with EFI_DEVICE_ERROR. Cc: Ard Biesheuvel Cc: Jordan Justen Cc: Tom Lendacky Cc: Laszlo Ersek Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Brijesh Singh [lersek@redhat.com: fix typos in subject] Reviewed-by: Laszlo Ersek Tested-by: Laszlo Ersek --- OvmfPkg/VirtioBlkDxe/VirtioBlk.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/VirtioBlkDxe/VirtioBlk.c b/OvmfPkg/VirtioBlkDxe/VirtioBlk.c index 6abd937f86..5a63986b3f 100644 --- a/OvmfPkg/VirtioBlkDxe/VirtioBlk.c +++ b/OvmfPkg/VirtioBlkDxe/VirtioBlk.c @@ -260,6 +260,7 @@ SynchronousRequest ( EFI_PHYSICAL_ADDRESS HostStatusDeviceAddress; EFI_PHYSICAL_ADDRESS RequestDeviceAddress; EFI_STATUS Status; + EFI_STATUS UnmapStatus; BlockSize = Dev->BlockIoMedia.BlockSize; @@ -430,7 +431,13 @@ SynchronousRequest ( UnmapDataBuffer: if (BufferSize > 0) { - Dev->VirtIo->UnmapSharedBuffer (Dev->VirtIo, BufferMapping); + UnmapStatus = Dev->VirtIo->UnmapSharedBuffer (Dev->VirtIo, BufferMapping); + if (EFI_ERROR (UnmapStatus) && !RequestIsWrite && !EFI_ERROR (Status)) { + // + // Data from the bus master may not reach the caller; fail the request. + // + Status = EFI_DEVICE_ERROR; + } } UnmapRequestBuffer: