From 82e280e013e62eaffcaaba984ca554fa9166a9f7 Mon Sep 17 00:00:00 2001 From: Nate DeSimone Date: Fri, 7 Mar 2025 16:48:30 -0800 Subject: [PATCH 1/2] Handle Case When Extended FV Header Does Not Exist According to the UEFI Platform Initialization (PI) Specification 1.8A, Volume 3, Section 3.2.1.1, the ExtHeaderOffset field can be zero. In which case, the Extended FV Header does not exist. If ExtHeaderOffset is zero, do not attempt to parse the Extended FV Header. Spec Reference: https://uefi.org/specs/PI/1.8A/V3_Code_Definitions.html#efi-firmware-volume-header Signed-off-by: Nate DeSimone --- uefi_firmware/uefi.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/uefi_firmware/uefi.py b/uefi_firmware/uefi.py index 2605cd0..cdfc11d 100644 --- a/uefi_firmware/uefi.py +++ b/uefi_firmware/uefi.py @@ -1377,14 +1377,15 @@ def __init__(self, data, name="0"): print_error("Error invalid FV header data (%s)." % str(e)) return - try: - exthdr = self._data[self.exthdroff:self.exthdroff + self._EXT_HEADER_SIZE] - self.fvname, self.exthdrsize = struct.unpack("<16sI", exthdr) - assert self.exthdrsize == self._EXT_HEADER_SIZE - except Exception as e: - dlog(self, name, "Exception in __init__: %s" % (str(e))) - print_error("Error invalid FV header data (%s)." % str(e)) - # not fatal + if self.exthdroff != 0: + try: + exthdr = self._data[self.exthdroff:self.exthdroff + self._EXT_HEADER_SIZE] + self.fvname, self.exthdrsize = struct.unpack("<16sI", exthdr) + assert self.exthdrsize == self._EXT_HEADER_SIZE + except Exception as e: + dlog(self, name, "Exception in __init__: %s" % (str(e))) + print_error("Error invalid FV header data (%s)." % str(e)) + # not fatal self.valid_header = True pass From 768e5f6968d3b04db3a2632aedbb09f9d9596b67 Mon Sep 17 00:00:00 2001 From: Nate DeSimone Date: Mon, 25 Aug 2025 16:51:15 -0700 Subject: [PATCH 2/2] Fix Extended FV Header Decoding Errors When decoding headers, fetch 200 bytes instead of 100 bytes. This prevents "Error invalid FV header data" errors when parsing firmware volumes that contain an extended header. Often, the extended header on such firmware volumes extends past the first 100 bytes. Signed-off-by: Nate DeSimone --- uefi_firmware/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uefi_firmware/__init__.py b/uefi_firmware/__init__.py index ad8e10f..37a9157 100644 --- a/uefi_firmware/__init__.py +++ b/uefi_firmware/__init__.py @@ -44,7 +44,7 @@ def __init__(self, data, search=True): data = data[self.offset:] self.data = data - header = data[:100] + header = data[:200] for tester in checker.TESTERS: if tester().match(header): self.data_type = tester().name