Raise an error if the trailer chain loops back on itself (#9519)
This commit is contained in:
parent
3cb854e8b2
commit
3bf614e4b8
BIN
Tests/images/trailer_loop.pdf
Normal file
BIN
Tests/images/trailer_loop.pdf
Normal file
Binary file not shown.
@ -125,3 +125,8 @@ def test_duplicate_xref_entry() -> None:
|
||||
pdf = PdfParser("Tests/images/duplicate_xref_entry.pdf")
|
||||
assert pdf.xref_table.existing_entries[6][0] == 1197
|
||||
pdf.close()
|
||||
|
||||
|
||||
def test_trailer_loop() -> None:
|
||||
with pytest.raises(PdfFormatError, match="trailer loop found"):
|
||||
PdfParser("Tests/images/trailer_loop.pdf")
|
||||
|
||||
@ -685,7 +685,9 @@ class PdfParser:
|
||||
if b"Prev" in self.trailer_dict:
|
||||
self.read_prev_trailer(self.trailer_dict[b"Prev"])
|
||||
|
||||
def read_prev_trailer(self, xref_section_offset: int) -> None:
|
||||
def read_prev_trailer(
|
||||
self, xref_section_offset: int, processed_offsets: list[int] = []
|
||||
) -> None:
|
||||
assert self.buf is not None
|
||||
trailer_offset = self.read_xref_table(xref_section_offset=xref_section_offset)
|
||||
m = self.re_trailer_prev.search(
|
||||
@ -700,7 +702,11 @@ class PdfParser:
|
||||
)
|
||||
trailer_dict = self.interpret_trailer(trailer_data)
|
||||
if b"Prev" in trailer_dict:
|
||||
self.read_prev_trailer(trailer_dict[b"Prev"])
|
||||
processed_offsets.append(xref_section_offset)
|
||||
check_format_condition(
|
||||
trailer_dict[b"Prev"] not in processed_offsets, "trailer loop found"
|
||||
)
|
||||
self.read_prev_trailer(trailer_dict[b"Prev"], processed_offsets)
|
||||
|
||||
re_whitespace_optional = re.compile(whitespace_optional)
|
||||
re_name = re.compile(
|
||||
|
||||
Loading…
Reference in New Issue
Block a user