From 4a9fcab124369c5568a8373a0d2fbc527867a4d9 Mon Sep 17 00:00:00 2001 From: Wei6 Xu Date: Mon, 30 Oct 2023 14:17:24 +0800 Subject: StandaloneMmPkg/Core: Fix issue that offset calculation might be wrong MmCoreFfsFindMmDriver() assumes FileHeader is EFI_FFS_FILE_HEADER. If FileHeader is an EFI_FFS_FILE_HEADER2, 'FileHeader + 1' will get a wrong section address. Use FfsFindSection to get the section directly, instead of 'FileHeader + 1' to avoid this issue. MmCoreFfsFindMmDriver() also assumes section is EFI_COMMON_SECTION_HEADER. If Section is EFI_COMMON_SECTION_HEADER2, 'Section + 1' will get a wrong wrong InnerFvHeader adress. Add section head detection and calculate the address accordingly. Cc: Laszlo Ersek Cc: Ard Biesheuvel Cc: Sami Mujawar Cc: Ray Ni Signed-off-by: Wei6 Xu Reviewed-by: Ray Ni Reviewed-by: Laszlo Ersek --- StandaloneMmPkg/Core/FwVol.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) (limited to 'StandaloneMmPkg') diff --git a/StandaloneMmPkg/Core/FwVol.c b/StandaloneMmPkg/Core/FwVol.c index c3054ef..4d2b63a 100644 --- a/StandaloneMmPkg/Core/FwVol.c +++ b/StandaloneMmPkg/Core/FwVol.c @@ -79,8 +79,6 @@ MmCoreFfsFindMmDriver ( UINTN DepexSize; UINTN Index; EFI_COMMON_SECTION_HEADER *Section; - VOID *SectionData; - UINTN SectionDataSize; UINT32 DstBufferSize; VOID *ScratchBuffer; UINT32 ScratchBufferSize; @@ -117,23 +115,21 @@ MmCoreFfsFindMmDriver ( break; } - Status = FfsFindSectionData ( + Status = FfsFindSection ( EFI_SECTION_GUID_DEFINED, FileHeader, - &SectionData, - &SectionDataSize + &Section ); if (EFI_ERROR (Status)) { break; } - Section = (EFI_COMMON_SECTION_HEADER *)(FileHeader + 1); - Status = ExtractGuidedSectionGetInfo ( - Section, - &DstBufferSize, - &ScratchBufferSize, - &SectionAttribute - ); + Status = ExtractGuidedSectionGetInfo ( + Section, + &DstBufferSize, + &ScratchBufferSize, + &SectionAttribute + ); if (EFI_ERROR (Status)) { break; } @@ -194,8 +190,13 @@ MmCoreFfsFindMmDriver ( goto FreeDstBuffer; } - InnerFvHeader = (VOID *)(Section + 1); - Status = MmCoreFfsFindMmDriver (InnerFvHeader, Depth + 1); + if (IS_SECTION2 (Section)) { + InnerFvHeader = (VOID *)((EFI_COMMON_SECTION_HEADER2 *)Section + 1); + } else { + InnerFvHeader = (VOID *)(Section + 1); + } + + Status = MmCoreFfsFindMmDriver (InnerFvHeader, Depth + 1); if (EFI_ERROR (Status)) { goto FreeDstBuffer; } -- cgit v1.1