Skip to content

Commit

Permalink
fdf_parser.py: support SECTION COMPRESS sections (#654)
Browse files Browse the repository at this point in the history
Previously, the FDF parser would fail to parse an FDF file with statements containing a SECTION COMPRESS with additional with nested sub sections. 

This PR updates the parser to be able to get past the parsing of the this, by checking there is an equal in the statement line, and pass it.
  • Loading branch information
apop5 authored Oct 18, 2024
1 parent 954f914 commit 7531944
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 1 deletion.
4 changes: 3 additions & 1 deletion edk2toollib/uefi/edk2/parsers/fdf_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,9 @@ def ParseFile(self, filepath: str) -> None:
self.FVs[section]["Files"][currentName][sectionType] = {}
# TODO support guided sections
# ex: SECTION UI = "GenericGopDriver"
elif sline.upper().startswith("SECTION"): # get the section
elif (
sline.upper().startswith("SECTION") and sline.upper().count("=") > 0
): # get the section
section_def = sline[7:].strip().split("=", 1)
sectionType = section_def[0].strip() # UI in this example
sectionValue = section_def[1].strip()
Expand Down
78 changes: 78 additions & 0 deletions tests.unit/parsers/test_fdf_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,3 +101,81 @@ def test_section_guided():
assert (
"bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb" in parser.FVs["MAINFV"]["Files"]["aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"]
)


def test_file_raw_section_statements():
"""Check common file type statements from an FDF file"""

SAMPLE_FDF_FILE1 = textwrap.dedent("""\
[FV.MAINFV]
FILEFILE RAW = aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa {
SECTION COMPRESS {
SECTION RAW = $(OUTPUT_DIRECTORY)/$(TARGET)_$(TOOL_CHAIN_TAG)/FV/bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb.bin
}
}
""")
SAMPLE_FDF_FILE2 = textwrap.dedent("""\
[FV.MAINFV]
FILEFILE RAW = aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa {
SECTION RAW = $(OUTPUT_DIRECTORY)/$(TARGET)_$(TOOL_CHAIN_TAG)/FV/something.bin
SECTION PE32 = $(OUTPUT_DIRECTORY)/$(TARGET)_$(TOOL_CHAIN_TAG>/FV/Exec.efi
}
""")
SAMPLE_FDF_FILE3 = textwrap.dedent("""\
[FV.MAINFV]
FILEFILE RAW = aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa {
SECTION COMPRESS {
SECTION RAW = binary.bin
SECTION UI = a_ui.bin
SECTION PE32 = some_efi_file.efi
SECTION TE = some_te.te
}
}
""")
try:
with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", delete=False) as f:
f.write(SAMPLE_FDF_FILE1)
fdf_path = f.name

parser = FdfParser()
parser.ParseFile(fdf_path)
finally:
os.remove(fdf_path)

assert (
"$(OUTPUT_DIRECTORY)/$(TARGET)_$(TOOL_CHAIN_TAG)/FV/bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb.bin"
in parser.FVs["MAINFV"]["Files"]["aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"]["RAW"]
)

try:
with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", delete=False) as f:
f.write(SAMPLE_FDF_FILE2)
fdf_path = f.name

parser = FdfParser()
parser.ParseFile(fdf_path)
finally:
os.remove(fdf_path)
assert (
"$(OUTPUT_DIRECTORY)/$(TARGET)_$(TOOL_CHAIN_TAG)/FV/something.bin"
in parser.FVs["MAINFV"]["Files"]["aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"]["RAW"]
)
assert (
"$(OUTPUT_DIRECTORY)/$(TARGET)_$(TOOL_CHAIN_TAG>/FV/Exec.efi"
in parser.FVs["MAINFV"]["Files"]["aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"]["PE32"]
)

try:
with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", delete=False) as f:
f.write(SAMPLE_FDF_FILE3)
fdf_path = f.name

parser = FdfParser()
parser.ParseFile(fdf_path)
finally:
os.remove(fdf_path)

assert "binary.bin" in parser.FVs["MAINFV"]["Files"]["aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"]["RAW"]
assert "a_ui.bin" in parser.FVs["MAINFV"]["Files"]["aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"]["UI"]
assert "some_efi_file.efi" in parser.FVs["MAINFV"]["Files"]["aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"]["PE32"]
assert "some_te.te" in parser.FVs["MAINFV"]["Files"]["aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"]["TE"]

0 comments on commit 7531944

Please sign in to comment.