summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWei6 Xu <wei6.xu@intel.com>2023-10-30 14:17:24 +0800
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2023-12-19 09:29:07 +0000
commit4a9fcab124369c5568a8373a0d2fbc527867a4d9 (patch)
treed75eef6045cb54a0ae271dcea43f7366f70828f7
parent0904161f6f051b9f42ffa65b1f9aa4a5b29e2119 (diff)
downloadedk2-4a9fcab124369c5568a8373a0d2fbc527867a4d9.tar.gz
edk2-4a9fcab124369c5568a8373a0d2fbc527867a4d9.tar.bz2
edk2-4a9fcab124369c5568a8373a0d2fbc527867a4d9.zip
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 <lersek@redhat.com> Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Sami Mujawar <sami.mujawar@arm.com> Cc: Ray Ni <ray.ni@intel.com> Signed-off-by: Wei6 Xu <wei6.xu@intel.com> Reviewed-by: Ray Ni <ray.ni@intel.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com>
-rw-r--r--StandaloneMmPkg/Core/FwVol.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/StandaloneMmPkg/Core/FwVol.c b/StandaloneMmPkg/Core/FwVol.c
index c3054ef751..4d2b63a448 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;
}