]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
elf2efi: Fix header size calculation
authorJan Janssen <medhefgo@web.de>
Sun, 30 Jul 2023 18:59:04 +0000 (20:59 +0200)
committerJan Janssen <medhefgo@web.de>
Sun, 30 Jul 2023 19:31:38 +0000 (21:31 +0200)
The PE header size calculation failed to take the PE magic and coff
header size into account, which will lead to header truncation if we are
writing only 5 sections.

tools/elf2efi.py

index e233c8e3abaf6fbd812a8454fbf903f2bf5da7af..2e478940f5c17fff15eb0c2dea79ab243ac733cf 100755 (executable)
@@ -210,6 +210,7 @@ FILE_ALIGNMENT = 512
 
 # Nobody cares about DOS headers, so put the PE header right after.
 PE_OFFSET = 64
+PE_MAGIC = b"PE\0\0"
 
 
 def align_to(x: int, align: int) -> int:
@@ -304,7 +305,10 @@ def copy_sections(elf: ELFFile, opt: PeOptionalHeader) -> typing.List[PeSection]
 
 
 def apply_elf_relative_relocation(
-    reloc: ElfRelocation, image_base: int, sections: typing.List[PeSection], addend_size: int
+    reloc: ElfRelocation,
+    image_base: int,
+    sections: typing.List[PeSection],
+    addend_size: int,
 ):
     # fmt: off
     [target] = [
@@ -439,7 +443,7 @@ def write_pe(
     file.seek(0x3C, io.SEEK_SET)
     file.write(PE_OFFSET.to_bytes(2, byteorder="little"))
     file.seek(PE_OFFSET, io.SEEK_SET)
-    file.write(b"PE\0\0")
+    file.write(PE_MAGIC)
     file.write(coff)
     file.write(opt)
 
@@ -453,6 +457,8 @@ def write_pe(
         file.write(pe_s)
         offset = align_to(offset + len(pe_s.data), FILE_ALIGNMENT)
 
+    assert file.tell() <= opt.SizeOfHeaders
+
     for pe_s in sections:
         file.seek(pe_s.PointerToRawData, io.SEEK_SET)
         file.write(pe_s.data)
@@ -515,6 +521,8 @@ def elf2efi(args: argparse.Namespace):
 
     opt.SizeOfHeaders = align_to(
         PE_OFFSET
+        + len(PE_MAGIC)
+        + sizeof(PeCoffHeader)
         + coff.SizeOfOptionalHeader
         + sizeof(PeSection) * max(coff.NumberOfSections, args.minimum_sections),
         FILE_ALIGNMENT,