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:
Kinney, Michael D 2018-02-06 17:43:32 -08:00 committed by Michael D Kinney
parent 48ed4769fc
commit 7f0301e39a
2 changed files with 14 additions and 12 deletions

View File

@ -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);
}
}
}

View File

@ -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