Make sure gBS FreePool() is used to free the buffer always allocated by gBS AllocatePool() service.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10695 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
lgao4 2010-07-26 16:20:34 +00:00
parent 082be7a58a
commit 0433d8f018
2 changed files with 40 additions and 4 deletions

View File

@ -122,6 +122,7 @@ InternalGetSectionFromFv (
EFI_STATUS Status; EFI_STATUS Status;
EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;
UINT32 AuthenticationStatus; UINT32 AuthenticationStatus;
VOID* TempBuffer;
ASSERT (NameGuid != NULL); ASSERT (NameGuid != NULL);
ASSERT (Buffer != NULL); ASSERT (Buffer != NULL);
@ -170,6 +171,17 @@ InternalGetSectionFromFv (
); );
} }
if (!EFI_ERROR (Status)) {
//
// The found buffer by FV protocol is allocated by gBS AllocatePool() service.
// Copy the found buffer to the allocated buffer by AllocatePool().
// So, the returned buffer can be freed by FreePool().
//
TempBuffer = AllocateCopyPool (*Size, *Buffer);
gBS->FreePool (*Buffer);
*Buffer = TempBuffer;
}
return Status; return Status;
} }
@ -312,7 +324,11 @@ GetSectionFromAnyFvByFileType (
Done: Done:
if (HandleBuffer != NULL) { if (HandleBuffer != NULL) {
FreePool(HandleBuffer); //
// HandleBuffer is allocated by gBS AllocatePool() service.
// So, gBS FreePool() service is used to free HandleBuffer.
//
gBS->FreePool (HandleBuffer);
} }
return Status; return Status;
@ -435,8 +451,12 @@ GetSectionFromAnyFv (
Done: Done:
if (HandleBuffer != NULL) { if (HandleBuffer != NULL) {
FreePool(HandleBuffer); //
// HandleBuffer is allocated by gBS AllocatePool() service.
// So, gBS FreePool() service is used to free HandleBuffer.
//
gBS->FreePool (HandleBuffer);
} }
return Status; return Status;
@ -615,6 +635,7 @@ GetFileBufferByFilePath (
EFI_FIRMWARE_VOLUME2_PROTOCOL *FwVol; EFI_FIRMWARE_VOLUME2_PROTOCOL *FwVol;
EFI_SECTION_TYPE SectionType; EFI_SECTION_TYPE SectionType;
UINT8 *ImageBuffer; UINT8 *ImageBuffer;
UINT8 *TempBuffer;
UINTN ImageBufferSize; UINTN ImageBufferSize;
EFI_FV_FILETYPE Type; EFI_FV_FILETYPE Type;
EFI_FV_FILE_ATTRIBUTES Attrib; EFI_FV_FILE_ATTRIBUTES Attrib;
@ -642,6 +663,7 @@ GetFileBufferByFilePath (
FileInfo = NULL; FileInfo = NULL;
FileHandle = NULL; FileHandle = NULL;
ImageBuffer = NULL; ImageBuffer = NULL;
TempBuffer = NULL;
ImageBufferSize = 0; ImageBufferSize = 0;
*AuthenticationStatus = 0; *AuthenticationStatus = 0;
@ -702,6 +724,16 @@ GetFileBufferByFilePath (
AuthenticationStatus AuthenticationStatus
); );
} }
if (!EFI_ERROR (Status)) {
//
// The found buffer by FV protocol is allocated by gBS AllocatePool() service.
// Copy the found buffer to the allocated buffer by AllocatePool().
// Then, this returned buffer can be freed by FreePool().
//
TempBuffer = AllocateCopyPool (ImageBufferSize, ImageBuffer);
gBS->FreePool (ImageBuffer);
ImageBuffer = TempBuffer;
}
} }
} }
goto Finish; goto Finish;

View File

@ -96,7 +96,11 @@ PciSegmentLibConstructor (
ASSERT (Descriptors->Desc != ACPI_END_TAG_DESCRIPTOR); ASSERT (Descriptors->Desc != ACPI_END_TAG_DESCRIPTOR);
} }
FreePool(HandleBuffer); //
// HandleBuffer is allocated by gBS AllocatePool() service.
// So, gBS FreePool() service is used to free HandleBuffer.
//
gBS->FreePool (HandleBuffer);
return EFI_SUCCESS; return EFI_SUCCESS;
} }