{\r
EFI_STATUS Status;\r
UINTN Length;\r
+ UINTN RemainingSpaceSize;\r
\r
//\r
// Initialize WorkSpace as FTW_ERASED_BYTE\r
FtwDevice->FtwWorkSpaceSize,\r
&FtwDevice->FtwLastWriteHeader\r
);\r
- if (EFI_ERROR (Status)) {\r
+ RemainingSpaceSize = FtwDevice->FtwWorkSpaceSize - ((UINTN) FtwDevice->FtwLastWriteHeader - (UINTN) FtwDevice->FtwWorkSpace);\r
+ DEBUG ((EFI_D_INFO, "Ftw: Remaining work space size - %x\n", RemainingSpaceSize));\r
+ //\r
+ // If FtwGetLastWriteHeader() returns error, or the remaining space size is even not enough to contain\r
+ // one EFI_FAULT_TOLERANT_WRITE_HEADER + one EFI_FAULT_TOLERANT_WRITE_RECORD(It will cause that the header\r
+ // pointed by FtwDevice->FtwLastWriteHeader or record pointed by FtwDevice->FtwLastWriteRecord may contain invalid data),\r
+ // it needs to reclaim work space.\r
+ //\r
+ if (EFI_ERROR (Status) || RemainingSpaceSize < sizeof (EFI_FAULT_TOLERANT_WRITE_HEADER) + sizeof (EFI_FAULT_TOLERANT_WRITE_RECORD)) {\r
//\r
// reclaim work space in working block.\r
//\r