Commit 85f05cc57ffa0a863d9d9b23e73acea9410b2937
1 parent
2d0c6873
Detect xref pointer infinite loop (fixes #149)
Showing
5 changed files
with
134 additions
and
0 deletions
ChangeLog
libqpdf/QPDF.cc
| @@ -491,8 +491,10 @@ void | @@ -491,8 +491,10 @@ void | ||
| 491 | QPDF::read_xref(qpdf_offset_t xref_offset) | 491 | QPDF::read_xref(qpdf_offset_t xref_offset) |
| 492 | { | 492 | { |
| 493 | std::map<int, int> free_table; | 493 | std::map<int, int> free_table; |
| 494 | + std::set<qpdf_offset_t> visited; | ||
| 494 | while (xref_offset) | 495 | while (xref_offset) |
| 495 | { | 496 | { |
| 497 | + visited.insert(xref_offset); | ||
| 496 | char buf[7]; | 498 | char buf[7]; |
| 497 | memset(buf, 0, sizeof(buf)); | 499 | memset(buf, 0, sizeof(buf)); |
| 498 | this->m->file->seek(xref_offset, SEEK_SET); | 500 | this->m->file->seek(xref_offset, SEEK_SET); |
| @@ -520,6 +522,10 @@ QPDF::read_xref(qpdf_offset_t xref_offset) | @@ -520,6 +522,10 @@ QPDF::read_xref(qpdf_offset_t xref_offset) | ||
| 520 | { | 522 | { |
| 521 | xref_offset = read_xrefStream(xref_offset); | 523 | xref_offset = read_xrefStream(xref_offset); |
| 522 | } | 524 | } |
| 525 | + if (visited.count(xref_offset) != 0) | ||
| 526 | + { | ||
| 527 | + xref_offset = 0; | ||
| 528 | + } | ||
| 523 | } | 529 | } |
| 524 | 530 | ||
| 525 | if (! this->m->trailer.isInitialized()) | 531 | if (! this->m->trailer.isInitialized()) |
qpdf/qtest/qpdf.test
| @@ -221,6 +221,7 @@ my @bug_tests = ( | @@ -221,6 +221,7 @@ my @bug_tests = ( | ||
| 221 | ["141a", "/W entry size 0", 2], | 221 | ["141a", "/W entry size 0", 2], |
| 222 | ["141b", "/W entry size 0", 2], | 222 | ["141b", "/W entry size 0", 2], |
| 223 | ["143", "self-referential ostream", 3], | 223 | ["143", "self-referential ostream", 3], |
| 224 | + ["149", "xref prev pointer loop", 3], | ||
| 224 | ); | 225 | ); |
| 225 | $n_tests += scalar(@bug_tests); | 226 | $n_tests += scalar(@bug_tests); |
| 226 | foreach my $d (@bug_tests) | 227 | foreach my $d (@bug_tests) |
qpdf/qtest/qpdf/issue-149.out
0 → 100644
qpdf/qtest/qpdf/issue-149.pdf
0 → 100644
| 1 | +%PDF-1.7 | ||
| 2 | +%Á∑·∂ | ||
| 3 | +% vim: set tw=76 ts=2 et : | ||
| 4 | +% convert with: | ||
| 5 | +% ./fixlengths < hello.txt > hello.pdf ; ./genxref hello.pdf | ||
| 6 | +1 0 obj | ||
| 7 | + << /Type /Catalog | ||
| 8 | + /Outlines 6 0 R | ||
| 9 | + /Pages 2 0 R | ||
| 10 | + >> | ||
| 11 | +endobj | ||
| 12 | + | ||
| 13 | +2 0 obj | ||
| 14 | + << /Type /Pages | ||
| 15 | + /Kids [3 0 R] | ||
| 16 | + /Count 1 | ||
| 17 | + >> | ||
| 18 | +endobj | ||
| 19 | + | ||
| 20 | +3 0 obj | ||
| 21 | + << /Type /Page | ||
| 22 | + /Parent 2 0 R | ||
| 23 | + /MediaBox [0 0 595.276 841.89] | ||
| 24 | + /Contents 4 0 R | ||
| 25 | + /Resources << | ||
| 26 | + /ProcSet [/PDF /Text] | ||
| 27 | + /Font << /F1 5 0 R >> | ||
| 28 | + >> | ||
| 29 | + >> | ||
| 30 | +endobj | ||
| 31 | + | ||
| 32 | +4 0 obj | ||
| 33 | + << /Length 36 >> | ||
| 34 | +stream | ||
| 35 | + BT 80 100 Td /F1 48 Tf (foo) Tj ET | ||
| 36 | +endstream | ||
| 37 | +endobj | ||
| 38 | + | ||
| 39 | +5 0 obj | ||
| 40 | + << /Type /Font | ||
| 41 | + /Subtype /Type1 | ||
| 42 | + /Name /F1 | ||
| 43 | + /BaseFont /Helvetica | ||
| 44 | + /Encoding /MacRomanEncoding | ||
| 45 | + >> | ||
| 46 | +endobj | ||
| 47 | + | ||
| 48 | +6 0 obj | ||
| 49 | + << /Type /Outlines | ||
| 50 | + /Count 0 | ||
| 51 | + >> | ||
| 52 | +endobj | ||
| 53 | + | ||
| 54 | +xref | ||
| 55 | +0 7 | ||
| 56 | +0000000000 65535 f | ||
| 57 | +0000000125 00000 n | ||
| 58 | +0000000208 00000 n | ||
| 59 | +0000000283 00000 n | ||
| 60 | +0000000492 00000 n | ||
| 61 | +0000000583 00000 n | ||
| 62 | +0000000721 00000 n | ||
| 63 | + | ||
| 64 | +trailer | ||
| 65 | + << /Size 7 | ||
| 66 | + /Prev 1516 | ||
| 67 | + /Root 1 0 R | ||
| 68 | + >> | ||
| 69 | +startxref | ||
| 70 | +779%%EOF | ||
| 71 | + | ||
| 72 | +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
| 73 | +1 1 obj | ||
| 74 | + << /Type /Catalog | ||
| 75 | + /Outlines 6 0 R | ||
| 76 | + /Pages 2 1 R | ||
| 77 | + >> | ||
| 78 | +endobj | ||
| 79 | + | ||
| 80 | +2 1 obj | ||
| 81 | + << /Type /Pages | ||
| 82 | + /Kids [3 1 R] | ||
| 83 | + /Count 1 | ||
| 84 | + >> | ||
| 85 | +endobj | ||
| 86 | + | ||
| 87 | +3 1 obj | ||
| 88 | + << /Type /Page | ||
| 89 | + /Parent 2 1 R | ||
| 90 | + /MediaBox [0 0 595.276 841.89] | ||
| 91 | + /Contents 4 1 R | ||
| 92 | + /Resources << | ||
| 93 | + /ProcSet [/PDF /Text] | ||
| 94 | + /Font << /F1 5 0 R >> | ||
| 95 | + >> | ||
| 96 | + >> | ||
| 97 | +endobj | ||
| 98 | + | ||
| 99 | +4 1 obj | ||
| 100 | + << /Length 36 >> | ||
| 101 | +stream | ||
| 102 | + BT 80 100 Td /F1 48 Tf (bar) Tj ET | ||
| 103 | +endstream | ||
| 104 | +endobj | ||
| 105 | + | ||
| 106 | +xref | ||
| 107 | +1 4 | ||
| 108 | +0000001058 00001 n | ||
| 109 | +0000001141 00001 n | ||
| 110 | +0000001216 00001 n | ||
| 111 | +0000001425 00001 n | ||
| 112 | + | ||
| 113 | +trailer | ||
| 114 | + << /Size 11 | ||
| 115 | + /Prev 779 | ||
| 116 | + /Root 1 1 R | ||
| 117 | + >> | ||
| 118 | +startxref | ||
| 119 | +1516 | ||
| 120 | +%%EOF |