mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-23 17:13:13 -05:00
Merge pull request #8902 from THEBIGTOMMY13DEV/fix/self-program-header-overlap
fix(tools): reject SELF program tables overlapping the ELF header
This commit is contained in:
2 files changed
+23
No files matched your search
@@ -132,6 +132,27 @@ class UnwrapTest(unittest.TestCase):
|
||||
def tearDown(self):
|
||||
self.temporary.cleanup()
|
||||
|
||||
def test_program_table_overlapping_elf_header_preserves_output(self):
|
||||
for offset in (0, 8, 32, 63):
|
||||
for previous in (None, b"previous output"):
|
||||
with self.subTest(offset=offset, previous=previous):
|
||||
container = bytearray(build_container(default_segments(), default_records(), default_payloads()))
|
||||
struct.pack_into("<Q", container, ELF_HEADER_OFFSET + 0x20, offset)
|
||||
output = Path(self.directory) / "output.elf"
|
||||
if previous is not None:
|
||||
output.write_bytes(previous)
|
||||
else:
|
||||
output.unlink(missing_ok=True)
|
||||
result, output = self.convert(container)
|
||||
self.assertEqual(result.returncode, 2, result.stderr)
|
||||
self.assertIn("ELF program header table overlaps the ELF header", result.stderr)
|
||||
self.assertNotIn("Traceback", result.stderr)
|
||||
self.assertEqual((Path(self.directory) / "input.self").read_bytes(), container)
|
||||
if previous is None:
|
||||
self.assertFalse(output.exists())
|
||||
else:
|
||||
self.assertEqual(output.read_bytes(), previous)
|
||||
|
||||
def test_record_table_places_the_segments_and_keeps_the_alignment(self):
|
||||
container = build_container(default_segments(), default_records(), default_payloads())
|
||||
result, output = self.convert(container)
|
||||
|
||||
@@ -109,6 +109,8 @@ def parse_elf(data):
|
||||
count = struct.unpack_from("<H", header, 0x38)[0]
|
||||
if entry_size != 56 or count == 0:
|
||||
raise Refused("program header table is %d entries of %d bytes" % (count, entry_size))
|
||||
if program_offset < len(header):
|
||||
raise Refused("ELF program header table overlaps the ELF header")
|
||||
if inner + program_offset + count * entry_size > len(data):
|
||||
raise Refused("ELF program header table does not fit the file")
|
||||
headers = []
|
||||
|
||||
Reference in new issue
Block a user