mirror of https://github.com/acidanthera/audk.git
MdeModulePkg/DxeCapsuleLibFmp: Verify nested capsule with FMP
https://bugzilla.tianocore.org/show_bug.cgi?id=873 Update IsNestedFmpCapsule() to verify the CapsuleGuid in the CapsuleHeader against the installed Firmware Management Protocol instances. The current logic that uses the ESRT Table does not work because capsules are processed before the ESRT Table is published at the Ready To Boot event. Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Star Zeng <star.zeng@intel.com> Cc: Eric Dong <eric.dong@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com> Reviewed-by: Star Zeng <star.zeng@intel.com> Reviewed-by: Bret Barkelew <Bret.Barkelew@microsoft.com>
This commit is contained in:
parent
48ed4769fc
commit
7f0301e39a
|
@ -1190,7 +1190,6 @@ IsNestedFmpCapsule (
|
|||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SYSTEM_RESOURCE_TABLE *Esrt;
|
||||
EFI_SYSTEM_RESOURCE_ENTRY *EsrtEntry;
|
||||
UINTN Index;
|
||||
BOOLEAN EsrtGuidFound;
|
||||
|
@ -1198,6 +1197,8 @@ IsNestedFmpCapsule (
|
|||
UINTN NestedCapsuleSize;
|
||||
ESRT_MANAGEMENT_PROTOCOL *EsrtProtocol;
|
||||
EFI_SYSTEM_RESOURCE_ENTRY Entry;
|
||||
EFI_HANDLE *HandleBuffer;
|
||||
UINTN NumberOfHandles;
|
||||
|
||||
EsrtGuidFound = FALSE;
|
||||
if (mIsVirtualAddrConverted) {
|
||||
|
@ -1223,19 +1224,21 @@ IsNestedFmpCapsule (
|
|||
}
|
||||
|
||||
//
|
||||
// Check ESRT configuration table
|
||||
// Check Firmware Management Protocols
|
||||
//
|
||||
if (!EsrtGuidFound) {
|
||||
Status = EfiGetSystemConfigurationTable(&gEfiSystemResourceTableGuid, (VOID **)&Esrt);
|
||||
HandleBuffer = NULL;
|
||||
Status = GetFmpHandleBufferByType (
|
||||
&CapsuleHeader->CapsuleGuid,
|
||||
0,
|
||||
&NumberOfHandles,
|
||||
&HandleBuffer
|
||||
);
|
||||
if (!EFI_ERROR(Status)) {
|
||||
ASSERT (Esrt != NULL);
|
||||
EsrtEntry = (VOID *)(Esrt + 1);
|
||||
for (Index = 0; Index < Esrt->FwResourceCount; Index++, EsrtEntry++) {
|
||||
if (CompareGuid(&EsrtEntry->FwClass, &CapsuleHeader->CapsuleGuid)) {
|
||||
EsrtGuidFound = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
EsrtGuidFound = TRUE;
|
||||
}
|
||||
if (HandleBuffer != NULL) {
|
||||
FreePool (HandleBuffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -73,7 +73,6 @@
|
|||
[Guids]
|
||||
gEfiFmpCapsuleGuid ## SOMETIMES_CONSUMES ## GUID
|
||||
gWindowsUxCapsuleGuid ## SOMETIMES_CONSUMES ## GUID
|
||||
gEfiSystemResourceTableGuid ## SOMETIMES_CONSUMES ## GUID
|
||||
## SOMETIMES_CONSUMES ## Variable:L"CapsuleMax"
|
||||
## SOMETIMES_PRODUCES ## Variable:L"CapsuleMax"
|
||||
gEfiCapsuleReportGuid
|
||||
|
|
Loading…
Reference in New Issue