diff --git a/OvmfPkg/VirtioBlkDxe/VirtioBlk.c b/OvmfPkg/VirtioBlkDxe/VirtioBlk.c index 74ed52f9da..f881cde4c5 100644 --- a/OvmfPkg/VirtioBlkDxe/VirtioBlk.c +++ b/OvmfPkg/VirtioBlkDxe/VirtioBlk.c @@ -13,6 +13,7 @@ Copyright (C) 2012, Red Hat, Inc. Copyright (c) 2012 - 2018, Intel Corporation. All rights reserved.
Copyright (c) 2017, AMD Inc, All rights reserved.
+ Copyright (c) 2024, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @@ -240,7 +241,7 @@ SynchronousRequest ( ) { UINT32 BlockSize; - volatile VIRTIO_BLK_REQ Request; + volatile VIRTIO_BLK_REQ *Request; volatile UINT8 *HostStatus; VOID *HostStatusBuffer; DESC_INDICES Indices; @@ -273,15 +274,20 @@ SynchronousRequest ( // ASSERT (BufferSize % BlockSize == 0); + Request = AllocateZeroPool (sizeof (*Request)); + if (Request == NULL) { + return EFI_DEVICE_ERROR; + } + // // Prepare virtio-blk request header, setting zero size for flush. // IO Priority is homogeneously 0. // - Request.Type = RequestIsWrite ? - (BufferSize == 0 ? VIRTIO_BLK_T_FLUSH : VIRTIO_BLK_T_OUT) : - VIRTIO_BLK_T_IN; - Request.IoPrio = 0; - Request.Sector = MultU64x32 (Lba, BlockSize / 512); + Request->Type = RequestIsWrite ? + (BufferSize == 0 ? VIRTIO_BLK_T_FLUSH : VIRTIO_BLK_T_OUT) : + VIRTIO_BLK_T_IN; + Request->IoPrio = 0; + Request->Sector = MultU64x32 (Lba, BlockSize / 512); // // Host status is bi-directional (we preset with a value and expect the @@ -294,7 +300,8 @@ SynchronousRequest ( &HostStatusBuffer ); if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; + Status = EFI_DEVICE_ERROR; + goto FreeBlkRequest; } HostStatus = HostStatusBuffer; @@ -306,8 +313,8 @@ SynchronousRequest ( Status = VirtioMapAllBytesInSharedBuffer ( Dev->VirtIo, VirtioOperationBusMasterRead, - (VOID *)&Request, - sizeof Request, + (VOID *)Request, + sizeof (*Request), &RequestDeviceAddress, &RequestMapping ); @@ -372,7 +379,7 @@ SynchronousRequest ( VirtioAppendDesc ( &Dev->Ring, RequestDeviceAddress, - sizeof Request, + sizeof (*Request), VRING_DESC_F_NEXT, &Indices ); @@ -454,6 +461,9 @@ FreeHostStatusBuffer: HostStatusBuffer ); +FreeBlkRequest: + FreePool ((VOID *)Request); + return Status; }