MdeModulePkg/IntelFrameworkModulePkg FwVol:

Move the check of FV Header signature and file system to
  GetFwVolHeader() to avoid reading the whole unexpected FvHeader.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16255 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Star Zeng 2014-10-29 03:31:46 +00:00 committed by lzeng14
parent 24903bc48a
commit 4888d15e74
5 changed files with 42 additions and 50 deletions

View File

@ -4,7 +4,7 @@
Layers on top of Firmware Block protocol to produce a file abstraction Layers on top of Firmware Block protocol to produce a file abstraction
of FV based files. of FV based files.
Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR> Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions are licensed and made available under the terms and conditions
@ -34,6 +34,8 @@
@retval EFI_SUCCESS Successfully read volume header to the allocated @retval EFI_SUCCESS Successfully read volume header to the allocated
buffer. buffer.
@retval EFI_ACCESS_DENIED Read status of FV is not enabled. @retval EFI_ACCESS_DENIED Read status of FV is not enabled.
@retval EFI_INVALID_PARAMETER The FV Header signature is not as expected or
the file system could not be understood.
**/ **/
EFI_STATUS EFI_STATUS
GetFwVolHeader ( GetFwVolHeader (
@ -90,6 +92,22 @@ GetFwVolHeader (
); );
} }
//
// Validate FV Header signature, if not as expected, continue.
//
if (TempFvh.Signature != EFI_FVH_SIGNATURE) {
return EFI_INVALID_PARAMETER;
}
//
// Check to see that the file system is indeed formatted in a way we can
// understand it...
//
if ((!CompareGuid (&TempFvh.FileSystemGuid, &gEfiFirmwareFileSystem2Guid)) &&
(!CompareGuid (&TempFvh.FileSystemGuid, &gEfiFirmwareFileSystem3Guid))) {
return EFI_INVALID_PARAMETER;
}
*FwVolHeader = AllocatePool (TempFvh.HeaderLength); *FwVolHeader = AllocatePool (TempFvh.HeaderLength);
if (*FwVolHeader == NULL) { if (*FwVolHeader == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
@ -669,15 +687,6 @@ FwVolDriverInit (
continue; continue;
} }
ASSERT (FwVolHeader != NULL); ASSERT (FwVolHeader != NULL);
//
// Check to see that the file system is indeed formatted in a way we can
// understand it...
//
if ((!CompareGuid (&FwVolHeader->FileSystemGuid, &gEfiFirmwareFileSystem2Guid)) &&
(!CompareGuid (&FwVolHeader->FileSystemGuid, &gEfiFirmwareFileSystem3Guid))) {
FreePool (FwVolHeader);
continue;
}
FreePool (FwVolHeader); FreePool (FwVolHeader);
Reinstall = FALSE; Reinstall = FALSE;

View File

@ -1,7 +1,7 @@
/** @file /** @file
Common defines and definitions for a FwVolDxe driver. Common defines and definitions for a FwVolDxe driver.
Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR> Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions are licensed and made available under the terms and conditions
@ -484,6 +484,8 @@ IsValidFFSFile (
@retval EFI_SUCCESS Successfully read volume header to the allocated @retval EFI_SUCCESS Successfully read volume header to the allocated
buffer. buffer.
@retval EFI_ACCESS_DENIED Read status of FV is not enabled. @retval EFI_ACCESS_DENIED Read status of FV is not enabled.
@retval EFI_INVALID_PARAMETER The FV Header signature is not as expected or
the file system could not be understood.
**/ **/
EFI_STATUS EFI_STATUS
GetFwVolHeader ( GetFwVolHeader (

View File

@ -2595,6 +2595,8 @@ ReadFvbData (
@retval EFI_OUT_OF_RESOURCES No enough buffer could be allocated. @retval EFI_OUT_OF_RESOURCES No enough buffer could be allocated.
@retval EFI_SUCCESS Successfully read volume header to the allocated @retval EFI_SUCCESS Successfully read volume header to the allocated
buffer. buffer.
@retval EFI_INVALID_PARAMETER The FV Header signature is not as expected or
the file system could not be understood.
**/ **/
EFI_STATUS EFI_STATUS

View File

@ -173,6 +173,8 @@ ReadFvbData (
@retval EFI_OUT_OF_RESOURCES No enough buffer could be allocated. @retval EFI_OUT_OF_RESOURCES No enough buffer could be allocated.
@retval EFI_SUCCESS Successfully read volume header to the allocated @retval EFI_SUCCESS Successfully read volume header to the allocated
buffer. buffer.
@retval EFI_INVALID_PARAMETER The FV Header signature is not as expected or
the file system could not be understood.
**/ **/
EFI_STATUS EFI_STATUS
@ -199,6 +201,22 @@ GetFwVolHeader (
return Status; return Status;
} }
//
// Validate FV Header signature, if not as expected, continue.
//
if (TempFvh.Signature != EFI_FVH_SIGNATURE) {
return EFI_INVALID_PARAMETER;
}
//
// Check to see that the file system is indeed formatted in a way we can
// understand it...
//
if ((!CompareGuid (&TempFvh.FileSystemGuid, &gEfiFirmwareFileSystem2Guid)) &&
(!CompareGuid (&TempFvh.FileSystemGuid, &gEfiFirmwareFileSystem3Guid))) {
return EFI_INVALID_PARAMETER;
}
// //
// Allocate a buffer for the caller // Allocate a buffer for the caller
// //
@ -658,29 +676,11 @@ NotifyFwVolBlock (
} }
ASSERT (FwVolHeader != NULL); ASSERT (FwVolHeader != NULL);
//
// Validate FV Header signature, if not as expected, continue.
//
if (FwVolHeader->Signature != EFI_FVH_SIGNATURE) {
CoreFreePool (FwVolHeader);
continue;
}
if (!VerifyFvHeaderChecksum (FwVolHeader)) { if (!VerifyFvHeaderChecksum (FwVolHeader)) {
CoreFreePool (FwVolHeader); CoreFreePool (FwVolHeader);
continue; continue;
} }
//
// Check to see that the file system is indeed formatted in a way we can
// understand it...
//
if ((!CompareGuid (&FwVolHeader->FileSystemGuid, &gEfiFirmwareFileSystem2Guid)) &&
(!CompareGuid (&FwVolHeader->FileSystemGuid, &gEfiFirmwareFileSystem3Guid))) {
continue;
}
// //
// Check if there is an FV protocol already installed in that handle // Check if there is an FV protocol already installed in that handle
// //

View File

@ -405,25 +405,4 @@ IsValidFfsFile (
IN EFI_FFS_FILE_HEADER *FfsHeader IN EFI_FFS_FILE_HEADER *FfsHeader
); );
/**
given the supplied FW_VOL_BLOCK_PROTOCOL, allocate a buffer for output and
copy the volume header into it.
@param Fvb The FW_VOL_BLOCK_PROTOCOL instance from which to
read the volume header
@param FwVolHeader Pointer to pointer to allocated buffer in which
the volume header is returned.
@retval EFI_OUT_OF_RESOURCES No enough buffer could be allocated.
@retval EFI_SUCCESS Successfully read volume header to the allocated
buffer.
**/
EFI_STATUS
GetFwVolHeader (
IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb,
OUT EFI_FIRMWARE_VOLUME_HEADER **FwVolHeader
);
#endif #endif