From: lgao4 Date: Mon, 10 Dec 2007 08:50:24 +0000 (+0000) Subject: Move sure FvImage buffer at its alignment when install FVB protocol on it. X-Git-Tag: edk2-stable201903~21682 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=38837959db04259d0dbfc1ab906330961d5f9d8e Move sure FvImage buffer at its alignment when install FVB protocol on it. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4380 6f19259b-4bc3-4df7-8a09-765794883524 --- diff --git a/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c b/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c index 9c99442e7a..d348c82a9e 100644 --- a/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c +++ b/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c @@ -859,14 +859,20 @@ Returns: EFI_SECTION_TYPE SectionType; UINT32 AuthenticationStatus; VOID *Buffer; + VOID *AlignedBuffer; UINTN BufferSize; + EFI_FIRMWARE_VOLUME_HEADER *FvHeader; + UINT32 FvAlignment; // // Read the first (and only the first) firmware volume section // SectionType = EFI_SECTION_FIRMWARE_VOLUME_IMAGE; + FvHeader = NULL; + FvAlignment = 0; Buffer = NULL; BufferSize = 0; + AlignedBuffer = NULL; Status = Fv->ReadSection ( Fv, DriverName, @@ -878,22 +884,50 @@ Returns: ); if (!EFI_ERROR (Status)) { // - // Produce a FVB protocol for the file + // FvImage should be at its required alignment. // - Status = ProduceFVBProtocolOnBuffer ( - (EFI_PHYSICAL_ADDRESS) (UINTN) Buffer, - (UINT64)BufferSize, - FvHandle, - NULL - ); + FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) Buffer; + FvAlignment = 1 << ((FvHeader->Attributes & EFI_FVB2_ALIGNMENT) >> 16); + // + // FvAlignment must be more than 8 bytes required by FvHeader structure. + // + if (FvAlignment < 8) { + FvAlignment = 8; + } + + AlignedBuffer = AllocateAlignedPool ((UINTN) BufferSize, (UINTN) FvAlignment); + if (AlignedBuffer == NULL) { + Status = EFI_OUT_OF_RESOURCES; + } else { + // + // Move FvImage into the aligned buffer and release the original buffer. + // + CopyMem (AlignedBuffer, Buffer, BufferSize); + CoreFreePool (Buffer); + Buffer = NULL; + // + // Produce a FVB protocol for the file + // + Status = ProduceFVBProtocolOnBuffer ( + (EFI_PHYSICAL_ADDRESS) (UINTN) AlignedBuffer, + (UINT64)BufferSize, + FvHandle, + NULL + ); + } } - if (EFI_ERROR (Status) && (Buffer != NULL)) { - // - // ReadSection or Produce FVB failed, Free data buffer - // - CoreFreePool (Buffer); - + if (EFI_ERROR (Status)) { + // + // ReadSection or Produce FVB failed, Free data buffer + // + if (Buffer != NULL) { + CoreFreePool (Buffer); + } + + if (AlignedBuffer != NULL) { + FreeAlignedPool (AlignedBuffer); + } } return Status; diff --git a/MdeModulePkg/Core/Dxe/FwVolBlock/FwVolBlock.c b/MdeModulePkg/Core/Dxe/FwVolBlock/FwVolBlock.c index bdac781776..d507167594 100644 --- a/MdeModulePkg/Core/Dxe/FwVolBlock/FwVolBlock.c +++ b/MdeModulePkg/Core/Dxe/FwVolBlock/FwVolBlock.c @@ -413,8 +413,10 @@ Returns: UINTN BlockIndex; UINTN BlockIndex2; UINTN LinearOffset; + UINT32 FvAlignment; EFI_FV_BLOCK_MAP_ENTRY *PtrBlockMapEntry; - + + FvAlignment = 0; FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)BaseAddress; // // Validate FV Header, if not as expected, return @@ -423,6 +425,19 @@ Returns: return EFI_VOLUME_CORRUPTED; } // + // Get FvHeader alignment + // + FvAlignment = 1 << ((FwVolHeader->Attributes & EFI_FVB2_ALIGNMENT) >> 16); + if (FvAlignment < 8) { + FvAlignment = 8; + } + if ((UINTN)BaseAddress % FvAlignment != 0) { + // + // FvImage buffer is not at its required alignment. + // + return EFI_VOLUME_CORRUPTED; + } + // // Allocate EFI_FW_VOL_BLOCK_DEVICE // FvbDev = CoreAllocateCopyPool (sizeof (EFI_FW_VOL_BLOCK_DEVICE), &mFwVolBlock);