diff options
-rw-r--r-- | StandaloneMmPkg/Core/FwVol.c | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/StandaloneMmPkg/Core/FwVol.c b/StandaloneMmPkg/Core/FwVol.c index e1e20ffd14..c3054ef751 100644 --- a/StandaloneMmPkg/Core/FwVol.c +++ b/StandaloneMmPkg/Core/FwVol.c @@ -84,6 +84,7 @@ MmCoreFfsFindMmDriver ( UINT32 DstBufferSize;
VOID *ScratchBuffer;
UINT32 ScratchBufferSize;
+ VOID *AllocatedDstBuffer;
VOID *DstBuffer;
UINT16 SectionAttribute;
UINT32 AuthenticationStatus;
@@ -148,25 +149,35 @@ MmCoreFfsFindMmDriver ( //
// Allocate destination buffer, extra one page for adjustment
//
- DstBuffer = (VOID *)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES (DstBufferSize));
- if (DstBuffer == NULL) {
+ AllocatedDstBuffer = (VOID *)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES (DstBufferSize));
+ if (AllocatedDstBuffer == NULL) {
+ FreePages (ScratchBuffer, EFI_SIZE_TO_PAGES (ScratchBufferSize));
return EFI_OUT_OF_RESOURCES;
}
//
// Call decompress function
//
- Status = ExtractGuidedSectionDecode (
- Section,
- &DstBuffer,
- ScratchBuffer,
- &AuthenticationStatus
- );
+ DstBuffer = AllocatedDstBuffer;
+ Status = ExtractGuidedSectionDecode (
+ Section,
+ &DstBuffer,
+ ScratchBuffer,
+ &AuthenticationStatus
+ );
FreePages (ScratchBuffer, EFI_SIZE_TO_PAGES (ScratchBufferSize));
if (EFI_ERROR (Status)) {
goto FreeDstBuffer;
}
+ //
+ // Free allocated DstBuffer if it is not used
+ //
+ if (DstBuffer != AllocatedDstBuffer) {
+ FreePages (AllocatedDstBuffer, EFI_SIZE_TO_PAGES (DstBufferSize));
+ AllocatedDstBuffer = NULL;
+ }
+
DEBUG ((
DEBUG_INFO,
"Processing compressed firmware volume (AuthenticationStatus == %x)\n",
@@ -210,7 +221,9 @@ MmCoreFfsFindMmDriver ( return EFI_SUCCESS;
FreeDstBuffer:
- FreePages (DstBuffer, EFI_SIZE_TO_PAGES (DstBufferSize));
+ if (AllocatedDstBuffer != NULL) {
+ FreePages (AllocatedDstBuffer, EFI_SIZE_TO_PAGES (DstBufferSize));
+ }
return Status;
}
|