This fixes a bug whereby the image description is written over file data when
the file's size is close to a multiple of the block size.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Brendan Jackman <brendan.jackman@arm.com>
Reviewed-by: Olivier Martin <olivier.martin@arm.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15517
6f19259b-4bc3-4df7-8a09-
765794883524
\r
#include <Protocol/SimpleFileSystem.h>\r
\r
\r
#include <Protocol/SimpleFileSystem.h>\r
\r
-EFI_STATUS\r
-BootMonFsDiscoverNextImage (\r
- IN BOOTMON_FS_INSTANCE *Flash,\r
- IN EFI_LBA *LbaStart,\r
- OUT HW_IMAGE_DESCRIPTION *Image\r
- );\r
-\r
EFI_STATUS\r
BootMonFsInitialize (\r
IN BOOTMON_FS_INSTANCE *Instance\r
EFI_STATUS\r
BootMonFsInitialize (\r
IN BOOTMON_FS_INSTANCE *Instance\r
EFI_STATUS\r
BootMonFsDiscoverNextImage (\r
EFI_STATUS\r
BootMonFsDiscoverNextImage (\r
- IN BOOTMON_FS_INSTANCE *Instance,\r
- IN EFI_LBA *LbaStart,\r
- OUT HW_IMAGE_DESCRIPTION *ImageDescription\r
+ IN BOOTMON_FS_INSTANCE *Instance,\r
+ IN OUT EFI_LBA *LbaStart,\r
+ IN OUT BOOTMON_FS_FILE *File\r
)\r
{\r
EFI_DISK_IO_PROTOCOL *DiskIo;\r
)\r
{\r
EFI_DISK_IO_PROTOCOL *DiskIo;\r
Instance->Media->MediaId,\r
DescOffset,\r
sizeof (HW_IMAGE_DESCRIPTION),\r
Instance->Media->MediaId,\r
DescOffset,\r
sizeof (HW_IMAGE_DESCRIPTION),\r
);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
// If we found a valid image description...\r
);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
// If we found a valid image description...\r
- if (BootMonFsIsImageValid (ImageDescription, (CurrentLba - Instance->Media->LowestAlignedLba))) {\r
- DEBUG ((EFI_D_ERROR, "Found image: %a in block %d.\n", &(ImageDescription->Footer.Filename), (UINTN)(CurrentLba - Instance->Media->LowestAlignedLba)));\r
-\r
- *LbaStart = ImageDescription->BlockEnd + 1;\r
+ if (BootMonFsIsImageValid (&File->HwDescription, (CurrentLba - Instance->Media->LowestAlignedLba))) {\r
+ DEBUG ((EFI_D_ERROR, "Found image: %a in block %d.\n",\r
+ &(File->HwDescription.Footer.Filename),\r
+ (UINTN)(CurrentLba - Instance->Media->LowestAlignedLba)\r
+ ));\r
+ File->HwDescAddress = DescOffset;\r
+\r
+ *LbaStart = CurrentLba + 1;\r
return EFI_SUCCESS;\r
} else {\r
CurrentLba++;\r
return EFI_SUCCESS;\r
} else {\r
CurrentLba++;\r
- Status = BootMonFsDiscoverNextImage (Instance, &Lba, &(NewFile->HwDescription));\r
+ Status = BootMonFsDiscoverNextImage (Instance, &Lba, NewFile);\r
if (EFI_ERROR (Status)) {\r
// Free NewFile allocated by BootMonFsCreateFile ()\r
FreePool (NewFile);\r
if (EFI_ERROR (Status)) {\r
// Free NewFile allocated by BootMonFsCreateFile ()\r
FreePool (NewFile);\r
LIST_ENTRY Link;\r
BOOTMON_FS_INSTANCE *Instance;\r
\r
LIST_ENTRY Link;\r
BOOTMON_FS_INSTANCE *Instance;\r
\r
HW_IMAGE_DESCRIPTION HwDescription;\r
\r
EFI_FILE_PROTOCOL File;\r
HW_IMAGE_DESCRIPTION HwDescription;\r
\r
EFI_FILE_PROTOCOL File;\r
EFI_DISK_IO_PROTOCOL *DiskIo;\r
EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
UINT32 MediaId;\r
EFI_DISK_IO_PROTOCOL *DiskIo;\r
EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
UINT32 MediaId;\r
VOID *Buffer;\r
EFI_STATUS Status;\r
VOID *Buffer;\r
EFI_STATUS Status;\r
- UINT64 DescriptionAddress;\r
\r
DiskIo = File->Instance->DiskIo;\r
BlockIo = File->Instance->BlockIo;\r
MediaId = BlockIo->Media->MediaId;\r
\r
DiskIo = File->Instance->DiskIo;\r
BlockIo = File->Instance->BlockIo;\r
MediaId = BlockIo->Media->MediaId;\r
- BlockSize = BlockIo->Media->BlockSize;\r
-\r
- DescriptionAddress = (File->HwDescription.BlockEnd * BlockSize)\r
- - sizeof (HW_IMAGE_DESCRIPTION);\r
\r
Buffer = AllocateZeroPool (sizeof (HW_IMAGE_DESCRIPTION));\r
\r
Status = DiskIo->WriteDisk (DiskIo,\r
MediaId,\r
\r
Buffer = AllocateZeroPool (sizeof (HW_IMAGE_DESCRIPTION));\r
\r
Status = DiskIo->WriteDisk (DiskIo,\r
MediaId,\r
sizeof (HW_IMAGE_DESCRIPTION),\r
Buffer\r
);\r
sizeof (HW_IMAGE_DESCRIPTION),\r
Buffer\r
);\r
\r
// Only invalidate the Image Description of files that have already been\r
// written in Flash\r
\r
// Only invalidate the Image Description of files that have already been\r
// written in Flash\r
- if (File->HwDescription.RegionCount > 0) {\r
+ if (File->HwDescAddress != 0) {\r
Status = InvalidateImageDescription (File);\r
ASSERT_EFI_ERROR (Status);\r
}\r
Status = InvalidateImageDescription (File);\r
ASSERT_EFI_ERROR (Status);\r
}\r
if ((NewFileSize % BlockSize) > 0) {\r
NewFileSize += BlockSize - (NewFileSize % BlockSize);\r
}\r
if ((NewFileSize % BlockSize) > 0) {\r
NewFileSize += BlockSize - (NewFileSize % BlockSize);\r
}\r
+\r
+ File->HwDescAddress = (FileStart + NewFileSize) - sizeof (HW_IMAGE_DESCRIPTION);\r
+\r
// Update the file description on the media\r
Status = DiskIo->WriteDisk (\r
DiskIo,\r
File->Instance->Media->MediaId,\r
// Update the file description on the media\r
Status = DiskIo->WriteDisk (\r
DiskIo,\r
File->Instance->Media->MediaId,\r
- (FileStart + NewFileSize) - sizeof (HW_IMAGE_DESCRIPTION),\r
sizeof (HW_IMAGE_DESCRIPTION),\r
Description\r
);\r
sizeof (HW_IMAGE_DESCRIPTION),\r
Description\r
);\r
BOOTMON_FS_FILE *File;\r
LIST_ENTRY *RegionToFlushLink;\r
BOOTMON_FS_FILE_REGION *Region;\r
BOOTMON_FS_FILE *File;\r
LIST_ENTRY *RegionToFlushLink;\r
BOOTMON_FS_FILE_REGION *Region;\r
- HW_IMAGE_DESCRIPTION *Description;\r
EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
UINT8 *EmptyBuffer;\r
\r
EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
UINT8 *EmptyBuffer;\r
\r
\r
// If (RegionCount is greater than 0) then the file already exists\r
if (File->HwDescription.RegionCount > 0) {\r
\r
// If (RegionCount is greater than 0) then the file already exists\r
if (File->HwDescription.RegionCount > 0) {\r
- Description = &File->HwDescription;\r
BlockIo = File->Instance->BlockIo;\r
\r
// Create an empty buffer\r
BlockIo = File->Instance->BlockIo;\r
\r
// Create an empty buffer\r
}\r
\r
// Invalidate the last Block\r
}\r
\r
// Invalidate the last Block\r
- Status = BlockIo->WriteBlocks (BlockIo, BlockIo->Media->MediaId, Description->BlockEnd, BlockIo->Media->BlockSize, EmptyBuffer);\r
+ Status = InvalidateImageDescription (File);\r
ASSERT_EFI_ERROR (Status);\r
\r
FreePool (EmptyBuffer);\r
ASSERT_EFI_ERROR (Status);\r
\r
FreePool (EmptyBuffer);\r