Commit 7c148c15cf2bbabc9332997b14ba8a8ff1d80773

Authored by m-holger
Committed by GitHub
2 parents 2a1a4045 695b912b

Merge pull request #1595 from m-holger/info

Improve error handling for common PDF anomalies.
libqpdf/QPDF_objects.cc
@@ -534,12 +534,20 @@ Objects::read_xref(qpdf_offset_t xref_offset, bool in_stream_recovery) @@ -534,12 +534,20 @@ Objects::read_xref(qpdf_offset_t xref_offset, bool in_stream_recovery)
534 if (!m->deleted_objects.empty()) { 534 if (!m->deleted_objects.empty()) {
535 max_obj = std::max(max_obj, *(m->deleted_objects.rbegin())); 535 max_obj = std::max(max_obj, *(m->deleted_objects.rbegin()));
536 } 536 }
537 - if ((size < 1) || (size - 1 != max_obj)) {  
538 - warn(damagedPDF(  
539 - "",  
540 - -1,  
541 - ("reported number of objects (" + std::to_string(size) +  
542 - ") is not one plus the highest object number (" + std::to_string(max_obj) + ")"))); 537 + if (size < 1 || (size - 1) != max_obj) {
  538 + if ((size - 2) == max_obj ){//&& qpdf.getObject(max_obj, 0).isStreamOfType("/XRef")) {
  539 + warn(damagedPDF(
  540 + "",
  541 + -1,
  542 + "xref entry for the xref stream itself is missing - a common error handled "
  543 + "correctly by qpdf and most other applications"));
  544 + } else {
  545 + warn(damagedPDF(
  546 + "",
  547 + -1,
  548 + ("reported number of objects (" + std::to_string(size) +
  549 + ") is not one plus the highest object number (" + std::to_string(max_obj) + ")")));
  550 + }
543 } 551 }
544 552
545 // We no longer need the deleted_objects table, so go ahead and clear it out to make sure we 553 // We no longer need the deleted_objects table, so go ahead and clear it out to make sure we
@@ -1475,7 +1483,10 @@ Objects::readObjectAtOffset( @@ -1475,7 +1483,10 @@ Objects::readObjectAtOffset(
1475 // "0000000000 00000 n", which is not correct, but it won't hurt anything for us to ignore 1483 // "0000000000 00000 n", which is not correct, but it won't hurt anything for us to ignore
1476 // these. 1484 // these.
1477 if (offset == 0) { 1485 if (offset == 0) {
1478 - warn(damagedPDF(-1, "object has offset 0")); 1486 + warn(damagedPDF(
  1487 + -1,
  1488 + "object has offset 0 - a common error handled correctly by qpdf and most other "
  1489 + "applications"));
1479 return; 1490 return;
1480 } 1491 }
1481 1492
qpdf/qtest/qpdf/bad12-recover.out
1 -WARNING: bad12.pdf: reported number of objects (9) is not one plus the highest object number (7) 1 +WARNING: bad12.pdf: xref entry for the xref stream itself is missing - a common error handled correctly by qpdf and most other applications
2 WARNING: bad12.pdf (object 2 0, offset 128): expected endobj 2 WARNING: bad12.pdf (object 2 0, offset 128): expected endobj
3 /QTest is implicit 3 /QTest is implicit
4 /QTest is direct and has type null (2) 4 /QTest is direct and has type null (2)
qpdf/qtest/qpdf/bad12.out
1 -WARNING: bad12.pdf: reported number of objects (9) is not one plus the highest object number (7) 1 +WARNING: bad12.pdf: xref entry for the xref stream itself is missing - a common error handled correctly by qpdf and most other applications
2 WARNING: bad12.pdf (object 2 0, offset 128): expected endobj 2 WARNING: bad12.pdf (object 2 0, offset 128): expected endobj
3 /QTest is implicit 3 /QTest is implicit
4 /QTest is direct and has type null (2) 4 /QTest is direct and has type null (2)
qpdf/qtest/qpdf/issue-150.out
@@ -3,5 +3,5 @@ WARNING: issue-150.pdf (xref stream: object 8 0, offset 56): treating object as @@ -3,5 +3,5 @@ WARNING: issue-150.pdf (xref stream: object 8 0, offset 56): treating object as
3 WARNING: issue-150.pdf: file is damaged 3 WARNING: issue-150.pdf: file is damaged
4 WARNING: issue-150.pdf (offset 4): xref not found 4 WARNING: issue-150.pdf (offset 4): xref not found
5 WARNING: issue-150.pdf: Attempting to reconstruct cross-reference table 5 WARNING: issue-150.pdf: Attempting to reconstruct cross-reference table
6 -WARNING: issue-150.pdf (object 8 0): object has offset 0 6 +WARNING: issue-150.pdf (object 8 0): object has offset 0 - a common error handled correctly by qpdf and most other applications
7 qpdf: issue-150.pdf: unable to find trailer dictionary while recovering damaged file 7 qpdf: issue-150.pdf: unable to find trailer dictionary while recovering damaged file
qpdf/qtest/qpdf/zero-offset.out
@@ -2,5 +2,5 @@ checking zero-offset.pdf @@ -2,5 +2,5 @@ checking zero-offset.pdf
2 PDF Version: 1.3 2 PDF Version: 1.3
3 File is not encrypted 3 File is not encrypted
4 File is not linearized 4 File is not linearized
5 -WARNING: zero-offset.pdf (object 6 0): object has offset 0 5 +WARNING: zero-offset.pdf (object 6 0): object has offset 0 - a common error handled correctly by qpdf and most other applications
6 qpdf: operation succeeded with warnings 6 qpdf: operation succeeded with warnings