From 8cc5590eab974ab34e2bfa1c9d6a7ef94c70ffae Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Wed, 26 Jan 2022 03:39:09 +0800 Subject: ArmPkg: MmCommunicationDxe: Update MM communicate `MessageLength` check REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3751 Current MM communicate routine from ArmPkg would conduct few checks prior to proceeding with SMC calls. However, the inspection step is different from PI specification. This patch updated MM communicate input argument inspection routine to assure that "if the `MessageLength` is zero, or too large for the MM implementation to manage, the MM implementation must update the `MessageLength` to reflect the size of the `Data` buffer that it can tolerate", as described by `EFI_MM_COMMUNICATION_PROTOCOL.Communicate()` section in PI specification. Cc: Leif Lindholm Cc: Ard Biesheuvel Cc: Bret Barkelew Cc: Michael Kubacki Cc: Sami Mujawar Signed-off-by: Kun Qin Reviewed-by: Sami Mujawar --- ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'ArmPkg/Drivers') diff --git a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c index 2f89b7c5b6..85d9034555 100644 --- a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c +++ b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c @@ -92,6 +92,7 @@ MmCommunication2Communicate ( return EFI_INVALID_PARAMETER; } + Status = EFI_SUCCESS; CommunicateHeader = CommBufferVirtual; // CommBuffer is a mandatory parameter. Hence, Rely on // MessageLength + Header to ascertain the @@ -109,28 +110,33 @@ MmCommunication2Communicate ( (*CommSize > mNsCommBuffMemRegion.Length)) { *CommSize = mNsCommBuffMemRegion.Length; - return EFI_BAD_BUFFER_SIZE; + Status = EFI_BAD_BUFFER_SIZE; } // // CommSize should cover at least MessageLength + sizeof (EFI_MM_COMMUNICATE_HEADER); // if (*CommSize < BufferSize) { - return EFI_INVALID_PARAMETER; + Status = EFI_INVALID_PARAMETER; } } // - // If the buffer size is 0 or greater than what can be tolerated by the MM + // If the message length is 0 or greater than what can be tolerated by the MM // environment then return the expected size. // - if ((BufferSize == 0) || + if ((CommunicateHeader->MessageLength == 0) || (BufferSize > mNsCommBuffMemRegion.Length)) { CommunicateHeader->MessageLength = mNsCommBuffMemRegion.Length - sizeof (CommunicateHeader->HeaderGuid) - sizeof (CommunicateHeader->MessageLength); - return EFI_BAD_BUFFER_SIZE; + Status = EFI_BAD_BUFFER_SIZE; + } + + // MessageLength or CommSize check has failed, return here. + if (EFI_ERROR (Status)) { + return Status; } // SMC Function ID -- cgit v1.2.3