From 4888d15e74628fd373605d5d853fa3b172aeadc3 Mon Sep 17 00:00:00 2001 From: Star Zeng Date: Wed, 29 Oct 2014 03:31:46 +0000 Subject: [PATCH] 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 Reviewed-by: Liming Gao git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16255 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Universal/FirmwareVolume/FwVolDxe/FwVol.c | 29 +++++++++------ .../FirmwareVolume/FwVolDxe/FwVolDriver.h | 4 ++- MdeModulePkg/Core/Dxe/DxeMain.h | 2 ++ MdeModulePkg/Core/Dxe/FwVol/FwVol.c | 36 +++++++++---------- MdeModulePkg/Core/Dxe/FwVol/FwVolDriver.h | 21 ----------- 5 files changed, 42 insertions(+), 50 deletions(-) diff --git a/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwVol.c b/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwVol.c index ecee616397..2ba09c49b5 100644 --- a/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwVol.c +++ b/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwVol.c @@ -4,7 +4,7 @@ Layers on top of Firmware Block protocol to produce a file abstraction of FV based files. - Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions @@ -34,6 +34,8 @@ @retval EFI_SUCCESS Successfully read volume header to the allocated buffer. @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 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); if (*FwVolHeader == NULL) { return EFI_OUT_OF_RESOURCES; @@ -669,15 +687,6 @@ FwVolDriverInit ( continue; } 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); Reinstall = FALSE; diff --git a/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwVolDriver.h b/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwVolDriver.h index e424f9572d..3f637c16ea 100644 --- a/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwVolDriver.h +++ b/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwVolDriver.h @@ -1,7 +1,7 @@ /** @file Common defines and definitions for a FwVolDxe driver. - Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
This program and the accompanying materials 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 buffer. @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 GetFwVolHeader ( diff --git a/MdeModulePkg/Core/Dxe/DxeMain.h b/MdeModulePkg/Core/Dxe/DxeMain.h index f4db06d43e..75542b3432 100644 --- a/MdeModulePkg/Core/Dxe/DxeMain.h +++ b/MdeModulePkg/Core/Dxe/DxeMain.h @@ -2595,6 +2595,8 @@ ReadFvbData ( @retval EFI_OUT_OF_RESOURCES No enough buffer could be allocated. @retval EFI_SUCCESS Successfully read volume header to the allocated buffer. + @retval EFI_INVALID_PARAMETER The FV Header signature is not as expected or + the file system could not be understood. **/ EFI_STATUS diff --git a/MdeModulePkg/Core/Dxe/FwVol/FwVol.c b/MdeModulePkg/Core/Dxe/FwVol/FwVol.c index a7b272b4d6..585d2437dc 100644 --- a/MdeModulePkg/Core/Dxe/FwVol/FwVol.c +++ b/MdeModulePkg/Core/Dxe/FwVol/FwVol.c @@ -173,6 +173,8 @@ ReadFvbData ( @retval EFI_OUT_OF_RESOURCES No enough buffer could be allocated. @retval EFI_SUCCESS Successfully read volume header to the allocated buffer. + @retval EFI_INVALID_PARAMETER The FV Header signature is not as expected or + the file system could not be understood. **/ EFI_STATUS @@ -199,6 +201,22 @@ GetFwVolHeader ( 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 // @@ -658,29 +676,11 @@ NotifyFwVolBlock ( } ASSERT (FwVolHeader != NULL); - // - // Validate FV Header signature, if not as expected, continue. - // - if (FwVolHeader->Signature != EFI_FVH_SIGNATURE) { - CoreFreePool (FwVolHeader); - continue; - } - if (!VerifyFvHeaderChecksum (FwVolHeader)) { CoreFreePool (FwVolHeader); 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 // diff --git a/MdeModulePkg/Core/Dxe/FwVol/FwVolDriver.h b/MdeModulePkg/Core/Dxe/FwVol/FwVolDriver.h index 514c6ed211..96cbde37d5 100644 --- a/MdeModulePkg/Core/Dxe/FwVol/FwVolDriver.h +++ b/MdeModulePkg/Core/Dxe/FwVol/FwVolDriver.h @@ -405,25 +405,4 @@ IsValidFfsFile ( 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 -- 2.39.2