MdeModulePkg/DxeCapsuleLibFmp: Fix crash if no ESRT is found

The ESRT table is not required in UEFI firmware. In such cases, the
table may not be present in the UEFI Configuration Table. The mEsrtTable
is to check if the IsNestedFmpCapsule() function is invoked at runtime
to determine whether to use gEsrtManagementProtocolGuid or the ESRT
table from the Configuration Table. Unfortunately, the check does not
cover situations where the ESRT is not present, potentially resulting in
a kernel crash. This patch is intended to fix this issue.

Signed-off-by: Nhi Pham <nhi@os.amperecomputing.com>
This commit is contained in:
Nhi Pham 2024-05-29 09:46:25 +07:00 committed by mergify[bot]
parent 948f234170
commit c36414b131
2 changed files with 17 additions and 0 deletions

View File

@ -11,6 +11,7 @@
performs basic validation. performs basic validation.
Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR> Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2024, Ampere Computing LLC. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
@ -48,6 +49,8 @@ EFI_EVENT mDxeCapsuleLibEndOfDxeEvent = NULL;
EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL *mFmpProgress = NULL; EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL *mFmpProgress = NULL;
extern BOOLEAN mDxeCapsuleLibReadyToBootEvent;
/** /**
Initialize capsule related variables. Initialize capsule related variables.
**/ **/
@ -1402,6 +1405,16 @@ IsNestedFmpCapsule (
} }
} }
} else { } else {
if (mDxeCapsuleLibReadyToBootEvent) {
//
// The ESRT table (mEsrtTable) in the Configuration Table would be located
// at the ReadyToBoot event if it exists. Hence, it should return here to
// avoid a crash due to calling gBS->LocateProtocol () at runtime in case
// there is no ERST table installed.
//
return FALSE;
}
// //
// Check ESRT protocol // Check ESRT protocol
// //

View File

@ -2,6 +2,7 @@
Capsule library runtime support. Capsule library runtime support.
Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR> Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2024, Ampere Computing LLC. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
@ -23,6 +24,7 @@
extern EFI_SYSTEM_RESOURCE_TABLE *mEsrtTable; extern EFI_SYSTEM_RESOURCE_TABLE *mEsrtTable;
EFI_EVENT mDxeRuntimeCapsuleLibVirtualAddressChangeEvent = NULL; EFI_EVENT mDxeRuntimeCapsuleLibVirtualAddressChangeEvent = NULL;
EFI_EVENT mDxeRuntimeCapsuleLibReadyToBootEvent = NULL; EFI_EVENT mDxeRuntimeCapsuleLibReadyToBootEvent = NULL;
BOOLEAN mDxeCapsuleLibReadyToBootEvent = FALSE;
/** /**
Convert EsrtTable physical address to virtual address. Convert EsrtTable physical address to virtual address.
@ -93,6 +95,8 @@ DxeCapsuleLibReadyToBootEventNotify (
// //
mEsrtTable->FwResourceCountMax = mEsrtTable->FwResourceCount; mEsrtTable->FwResourceCountMax = mEsrtTable->FwResourceCount;
} }
mDxeCapsuleLibReadyToBootEvent = TRUE;
} }
/** /**