From 8472f1f59d63f3fc5df3c9ae52ffb26c7bb757a6 Mon Sep 17 00:00:00 2001 From: lzeng14 Date: Thu, 8 Nov 2012 01:12:56 +0000 Subject: Build the registered guid HOB and SystemTable to record the GUID itself in PeiExtractGuidedSectionLib and DxeExtractGuidedSectionLib, and also state the restriction in BaseExtractGuidedSectionLib. Signed-off-by: Star Zeng Reviewed-by: Michael Kinney git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13930 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Dxe/SectionExtraction/CoreSectionExtraction.c | 57 +++++++++++++++++-- MdeModulePkg/Core/Pei/FwVol/FwVol.c | 66 +++++++++++++++++----- 2 files changed, 104 insertions(+), 19 deletions(-) (limited to 'MdeModulePkg/Core') diff --git a/MdeModulePkg/Core/Dxe/SectionExtraction/CoreSectionExtraction.c b/MdeModulePkg/Core/Dxe/SectionExtraction/CoreSectionExtraction.c index 40304b925c..ad3f58fa21 100644 --- a/MdeModulePkg/Core/Dxe/SectionExtraction/CoreSectionExtraction.c +++ b/MdeModulePkg/Core/Dxe/SectionExtraction/CoreSectionExtraction.c @@ -490,6 +490,53 @@ ChildIsType ( } } +/** + Verify the Guided Section GUID by checking if there is the Guided Section GUID configuration table recorded the GUID itself. + + @param GuidedSectionGuid The Guided Section GUID. + @param GuidedSectionExtraction A pointer to the pointer to the supported Guided Section Extraction Protocol + for the Guided Section. + + @return TRUE The GuidedSectionGuid could be identified, and the pointer to + the Guided Section Extraction Protocol will be returned to *GuidedSectionExtraction. + @return FALSE The GuidedSectionGuid could not be identified, or + the Guided Section Extraction Protocol has not been installed yet. + +**/ +BOOLEAN +VerifyGuidedSectionGuid ( + IN EFI_GUID *GuidedSectionGuid, + OUT EFI_GUIDED_SECTION_EXTRACTION_PROTOCOL **GuidedSectionExtraction + ) +{ + EFI_GUID *GuidRecorded; + VOID *Interface; + EFI_STATUS Status; + + // + // Check if there is the Guided Section GUID configuration table recorded the GUID itself. + // + Status = EfiGetSystemConfigurationTable (GuidedSectionGuid, (VOID **) &GuidRecorded); + if (Status == EFI_SUCCESS) { + if (CompareGuid (GuidRecorded, GuidedSectionGuid)) { + // + // Found the recorded GuidedSectionGuid. + // + Status = CoreLocateProtocol (GuidedSectionGuid, NULL, (VOID **) &Interface); + if (!EFI_ERROR (Status) && Interface != NULL) { + // + // Found the supported Guided Section Extraction Porotocol for the Guided Section. + // + *GuidedSectionExtraction = (EFI_GUIDED_SECTION_EXTRACTION_PROTOCOL *) Interface; + return TRUE; + } + return FALSE; + } + } + + return FALSE; +} + /** RPN callback function. Initializes the section stream when GUIDED_SECTION_EXTRACTION_PROTOCOL is installed. @@ -517,12 +564,11 @@ NotifyGuidedExtraction ( GuidedHeader = (EFI_GUID_DEFINED_SECTION *) (Context->ParentStream->StreamBuffer + Context->ChildNode->OffsetInStream); ASSERT (GuidedHeader->CommonHeader.Type == EFI_SECTION_GUID_DEFINED); - - Status = gBS->LocateProtocol (Context->ChildNode->EncapsulationGuid, NULL, (VOID **)&GuidedExtraction); - if (EFI_ERROR (Status)) { + + if (!VerifyGuidedSectionGuid (Context->ChildNode->EncapsulationGuid, &GuidedExtraction)) { return; } - + Status = GuidedExtraction->ExtractSection ( GuidedExtraction, GuidedHeader, @@ -793,8 +839,7 @@ CreateChildNode ( Node->EncapsulationGuid = &GuidedHeader->SectionDefinitionGuid; GuidedSectionAttributes = GuidedHeader->Attributes; } - Status = CoreLocateProtocol (Node->EncapsulationGuid, NULL, (VOID **)&GuidedExtraction); - if (!EFI_ERROR (Status) && GuidedExtraction != NULL) { + if (VerifyGuidedSectionGuid (Node->EncapsulationGuid, &GuidedExtraction)) { // // NewStreamBuffer is always allocated by ExtractSection... No caller // allocation here. diff --git a/MdeModulePkg/Core/Pei/FwVol/FwVol.c b/MdeModulePkg/Core/Pei/FwVol/FwVol.c index d0375be92e..af8f821ebb 100644 --- a/MdeModulePkg/Core/Pei/FwVol/FwVol.c +++ b/MdeModulePkg/Core/Pei/FwVol/FwVol.c @@ -606,6 +606,55 @@ FirmwareVolmeInfoPpiNotifyCallback ( return EFI_SUCCESS; } +/** + Verify the Guided Section GUID by checking if there is the Guided Section GUID HOB recorded the GUID itself. + + @param GuidedSectionGuid The Guided Section GUID. + @param GuidedSectionExtraction A pointer to the pointer to the supported Guided Section Extraction Ppi + for the Guided Section. + + @return TRUE The GuidedSectionGuid could be identified, and the pointer to + the Guided Section Extraction Ppi will be returned to *GuidedSectionExtraction. + @return FALSE The GuidedSectionGuid could not be identified, or + the Guided Section Extraction Ppi has not been installed yet. + +**/ +BOOLEAN +VerifyGuidedSectionGuid ( + IN EFI_GUID *GuidedSectionGuid, + OUT EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI **GuidedSectionExtraction + ) +{ + EFI_PEI_HOB_POINTERS Hob; + EFI_GUID *GuidRecorded; + VOID *Interface; + EFI_STATUS Status; + + // + // Check if there is the Guided Section GUID HOB recorded the GUID itself. + // + Hob.Raw = GetFirstGuidHob (GuidedSectionGuid); + if (Hob.Raw != NULL) { + GuidRecorded = (EFI_GUID *) GET_GUID_HOB_DATA (Hob); + if (CompareGuid (GuidRecorded, GuidedSectionGuid)) { + // + // Found the recorded GuidedSectionGuid. + // + Status = PeiServicesLocatePpi (GuidedSectionGuid, 0, NULL, (VOID **) &Interface); + if (!EFI_ERROR (Status) && Interface != NULL) { + // + // Found the supported Guided Section Extraction Ppi for the Guided Section. + // + *GuidedSectionExtraction = (EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI *) Interface; + return TRUE; + } + return FALSE; + } + } + + return FALSE; +} + /** Go through the file to search SectionType section. Search within encapsulation sections (compression and GUIDed) recursively, @@ -643,6 +692,7 @@ ProcessSection ( UINTN Index; UINT32 Authentication; PEI_CORE_INSTANCE *PrivateData; + EFI_GUID *SectionDefinitionGuid; PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices); *OutputBuffer = NULL; @@ -702,21 +752,11 @@ ProcessSection ( Status = EFI_NOT_FOUND; if (Section->Type == EFI_SECTION_GUID_DEFINED) { if (IS_SECTION2 (Section)) { - Status = PeiServicesLocatePpi ( - &((EFI_GUID_DEFINED_SECTION2 *)Section)->SectionDefinitionGuid, - 0, - NULL, - (VOID **) &GuidSectionPpi - ); + SectionDefinitionGuid = &((EFI_GUID_DEFINED_SECTION2 *)Section)->SectionDefinitionGuid; } else { - Status = PeiServicesLocatePpi ( - &((EFI_GUID_DEFINED_SECTION *)Section)->SectionDefinitionGuid, - 0, - NULL, - (VOID **) &GuidSectionPpi - ); + SectionDefinitionGuid = &((EFI_GUID_DEFINED_SECTION *)Section)->SectionDefinitionGuid; } - if (!EFI_ERROR (Status)) { + if (VerifyGuidedSectionGuid (SectionDefinitionGuid, &GuidSectionPpi)) { Status = GuidSectionPpi->ExtractSection ( GuidSectionPpi, Section, -- cgit v1.2.3