mirror of https://github.com/acidanthera/audk.git
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>
This commit is contained in:
parent
0904161f6f
commit
4a9fcab124
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue