diff options
| author | Kun Qin <kuqin@microsoft.com> | 2026-09-17 07:20:32 +0300 |
|---|---|---|
| committer | mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> | 2026-10-22 04:36:43 +0300 |
| commit | 68360d273c9788e75b9aca13f839563a5a6cb498 (patch) | |
| tree | d6d9f8e21653b3eabca9381028b2d9c771e39288 /BaseTools/Source/Python | |
| parent | 26d6e1f5f26a7456f63011a3107d0ca577eed489 (diff) | |
| download | edk2-68360d273c9788e75b9aca13f839563a5a6cb498.tar.xz | |
BaseTools: FvHandler: Safely update FV free-space nodes
Current FV resize routine assumes that the final child is always a free-
space node. However, when no such node exists, these routines can remove
or overwrite valid trailing FFS nodes. One replacement path also inserts
the free-space byte count instead of the constructed tree node.
This change centralizes free-space node creation, resizing, and removal,
using the helper for direct replacements and recursive parent resizing.
Signed-off-by: Kun Qin <kun.qin@microsoft.com>
Diffstat (limited to 'BaseTools/Source/Python')
| -rw-r--r-- | BaseTools/Source/Python/FMMT/core/FvHandler.py | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/BaseTools/Source/Python/FMMT/core/FvHandler.py b/BaseTools/Source/Python/FMMT/core/FvHandler.py index a1bd4685c6..c82fa4f0d1 100644 --- a/BaseTools/Source/Python/FMMT/core/FvHandler.py +++ b/BaseTools/Source/Python/FMMT/core/FvHandler.py @@ -145,6 +145,25 @@ def ModifyFvSystemGuid(TargetFv) -> None: else:
TargetFv.Data.Data += struct2stream(item.Data.Header)+ item.Data.Data + item.Data.PadData
+def SetFvFreeSpace(TargetFv, NewFreeSpace: int) -> None:
+ FreeSpaceTree = (
+ TargetFv.Child[-1]
+ if TargetFv.Child[-1].type == FFS_FREE_SPACE
+ else None
+ )
+ if NewFreeSpace:
+ if FreeSpaceTree is None:
+ FreeSpaceTree = BIOSTREE('FREE_SPACE')
+ FreeSpaceTree.type = FFS_FREE_SPACE
+ FreeSpaceTree.Data = FreeSpaceNode(b'\xff' * NewFreeSpace)
+ TargetFv.insertChild(FreeSpaceTree)
+ else:
+ FreeSpaceTree.Data.Data = b'\xff' * NewFreeSpace
+ FreeSpaceTree.Data.Size = NewFreeSpace
+ elif FreeSpaceTree is not None:
+ TargetFv.Child.remove(FreeSpaceTree)
+ TargetFv.Data.Free_Space = NewFreeSpace
+
class FvHandler:
def __init__(self, NewFfs, TargetFfs=None) -> None:
self.NewFfs = NewFfs
@@ -283,12 +302,10 @@ class FvHandler: BlockSize = ParTree.Data.Header.BlockMap[0].Length
New_Add_Len = BlockSize - Needed_Space%BlockSize
if New_Add_Len % BlockSize:
- ParTree.Child[-1].Data.Data = b'\xff' * New_Add_Len
- ParTree.Data.Free_Space = New_Add_Len
+ SetFvFreeSpace(ParTree, New_Add_Len)
Needed_Space += New_Add_Len
else:
- ParTree.Child.remove(ParTree.Child[-1])
- ParTree.Data.Free_Space = 0
+ SetFvFreeSpace(ParTree, 0)
ParTree.Data.Size += Needed_Space
ParTree.Data.Header.FvLength = ParTree.Data.Size
ModifyFvSystemGuid(ParTree)
@@ -451,15 +468,14 @@ class FvHandler: New_Add_Len = BlockSize - Needed_Space%BlockSize
Target_index = TargetFv.Child.index(self.TargetFfs)
if New_Add_Len % BlockSize:
- TargetFv.Child[-1].Data.Data = b'\xff' * New_Add_Len
- TargetFv.Data.Free_Space = New_Add_Len
+ SetFvFreeSpace(TargetFv, New_Add_Len)
Needed_Space += New_Add_Len
TargetFv.insertChild(self.NewFfs, Target_index)
TargetFv.Child.remove(self.TargetFfs)
else:
+ SetFvFreeSpace(TargetFv, 0)
TargetFv.Child.remove(self.TargetFfs)
- TargetFv.Data.Free_Space = 0
- TargetFv.insertChild(self.NewFfs)
+ TargetFv.insertChild(self.NewFfs, Target_index)
# Encapsulate the Fv Data for update.
TargetFv.Data.Data = b''
for item in TargetFv.Child:
@@ -488,11 +504,7 @@ class FvHandler: TargetFv.insertChild(self.NewFfs, Target_index)
# If TargetFv do not have free space, create free space for Fv.
else:
- New_Free_Space_Tree = BIOSTREE('FREE_SPACE')
- New_Free_Space_Tree.type = FFS_FREE_SPACE
- New_Free_Space_Tree.Data = FfsNode(b'\xff' * New_Free_Space)
- TargetFv.Data.Free_Space = New_Free_Space
- TargetFv.insertChild(New_Free_Space)
+ SetFvFreeSpace(TargetFv, New_Free_Space)
Target_index = TargetFv.Child.index(self.TargetFfs)
TargetFv.Child.remove(self.TargetFfs)
TargetFv.insertChild(self.NewFfs, Target_index)
|
