Commit e3b77e43d698073620d465944b0bde05d32259ce

Authored by m-holger
1 parent c6a393a5

Fix offsets in QPDF::resolveObjectsInStream warnings

As discussed in #1396.
libqpdf/QPDF_objects.cc
@@ -1608,7 +1608,8 @@ QPDF::resolveObjectsInStream(int obj_stream_number) @@ -1608,7 +1608,8 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
1608 m->file->getName() + " object stream " + std::to_string(obj_stream_number), 1608 m->file->getName() + " object stream " + std::to_string(obj_stream_number),
1609 +"object " + std::to_string(id) + " 0", 1609 +"object " + std::to_string(id) + " 0",
1610 offset, 1610 offset,
1611 - msg}; 1611 + msg,
  1612 + true};
1612 }; 1613 };
1613 1614
1614 if (m->resolved_object_streams.count(obj_stream_number)) { 1615 if (m->resolved_object_streams.count(obj_stream_number)) {
@@ -1667,6 +1668,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number) @@ -1667,6 +1668,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
1667 bool is_first = true; 1668 bool is_first = true;
1668 for (unsigned int i = 0; i < n; ++i) { 1669 for (unsigned int i = 0; i < n; ++i) {
1669 auto tnum = readToken(input); 1670 auto tnum = readToken(input);
  1671 + auto id_offset = input.getLastOffset();
1670 auto toffset = readToken(input); 1672 auto toffset = readToken(input);
1671 if (!(tnum.isInteger() && toffset.isInteger())) { 1673 if (!(tnum.isInteger() && toffset.isInteger())) {
1672 throw damaged(0, input.getLastOffset(), "expected integer in object stream header"); 1674 throw damaged(0, input.getLastOffset(), "expected integer in object stream header");
@@ -1677,13 +1679,13 @@ QPDF::resolveObjectsInStream(int obj_stream_number) @@ -1677,13 +1679,13 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
1677 1679
1678 if (num == obj_stream_number) { 1680 if (num == obj_stream_number) {
1679 QTC::TC("qpdf", "QPDF ignore self-referential object stream"); 1681 QTC::TC("qpdf", "QPDF ignore self-referential object stream");
1680 - warn(damaged(num, input.getLastOffset(), "object stream claims to contain itself")); 1682 + warn(damaged(num, id_offset, "object stream claims to contain itself"));
1681 continue; 1683 continue;
1682 } 1684 }
1683 1685
1684 if (num < 1) { 1686 if (num < 1) {
1685 QTC::TC("qpdf", "QPDF object stream contains id < 1"); 1687 QTC::TC("qpdf", "QPDF object stream contains id < 1");
1686 - warn(damaged(num, input.getLastOffset(), "object id is invalid"s)); 1688 + warn(damaged(num, id_offset, "object id is invalid"s));
1687 continue; 1689 continue;
1688 } 1690 }
1689 1691
@@ -1691,8 +1693,9 @@ QPDF::resolveObjectsInStream(int obj_stream_number) @@ -1691,8 +1693,9 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
1691 QTC::TC("qpdf", "QPDF object stream offsets not increasing"); 1693 QTC::TC("qpdf", "QPDF object stream offsets not increasing");
1692 warn(damaged( 1694 warn(damaged(
1693 num, 1695 num,
1694 - offset,  
1695 - "offset is invalid (must be larger than previous offset " + 1696 + input.getLastOffset(),
  1697 + "offset " + std::to_string(offset) +
  1698 + " is invalid (must be larger than previous offset " +
1696 std::to_string(last_offset) + ")")); 1699 std::to_string(last_offset) + ")"));
1697 continue; 1700 continue;
1698 } 1701 }
@@ -1702,7 +1705,8 @@ QPDF::resolveObjectsInStream(int obj_stream_number) @@ -1702,7 +1705,8 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
1702 } 1705 }
1703 1706
1704 if (first + offset >= end_offset) { 1707 if (first + offset >= end_offset) {
1705 - warn(damaged(num, offset, "offset is too large")); 1708 + warn(damaged(
  1709 + num, input.getLastOffset(), "offset " + std::to_string(offset) + " is too large"));
1706 continue; 1710 continue;
1707 } 1711 }
1708 1712
qpdf/qtest/qpdf/issue-143.out
@@ -14,9 +14,9 @@ WARNING: issue-143.pdf (object 1 0, offset 24): expected dictionary key but foun @@ -14,9 +14,9 @@ WARNING: issue-143.pdf (object 1 0, offset 24): expected dictionary key but foun
14 WARNING: issue-143.pdf (object 1 0, offset 21): stream dictionary lacks /Length key 14 WARNING: issue-143.pdf (object 1 0, offset 21): stream dictionary lacks /Length key
15 WARNING: issue-143.pdf (object 1 0, offset 84): attempting to recover stream length 15 WARNING: issue-143.pdf (object 1 0, offset 84): attempting to recover stream length
16 WARNING: issue-143.pdf (object 1 0, offset 84): recovered stream length: 606 16 WARNING: issue-143.pdf (object 1 0, offset 84): recovered stream length: 606
17 -WARNING: issue-143.pdf object stream 1 (object 0 0, offset 4): object id is invalid  
18 -WARNING: issue-143.pdf object stream 1 (object 0 0, offset 15): object id is invalid  
19 -WARNING: issue-143.pdf object stream 1 (object 6 0): offset is invalid (must be larger than previous offset 0)  
20 -WARNING: issue-143.pdf object stream 1 (object 0 0, offset 27): object id is invalid 17 +WARNING: issue-143.pdf object stream 1 (object 0 0, offset 0): object id is invalid
  18 +WARNING: issue-143.pdf object stream 1 (object 0 0, offset 11): object id is invalid
  19 +WARNING: issue-143.pdf object stream 1 (object 6 0, offset 21): offset 0 is invalid (must be larger than previous offset 0)
  20 +WARNING: issue-143.pdf object stream 1 (object 0 0, offset 23): object id is invalid
21 WARNING: issue-143.pdf object stream 1 (object 2 0, offset 33): expected dictionary key but found non-name object; inserting key /QPDFFake1 21 WARNING: issue-143.pdf object stream 1 (object 2 0, offset 33): expected dictionary key but found non-name object; inserting key /QPDFFake1
22 qpdf: issue-143.pdf: unable to find page tree 22 qpdf: issue-143.pdf: unable to find page tree
qpdf/qtest/qpdf/object-stream-self-ref.out
1 -WARNING: object-stream-self-ref.pdf object stream 1 (object 1 0, offset 2): object stream claims to contain itself 1 +WARNING: object-stream-self-ref.pdf object stream 1 (object 1 0, offset 0): object stream claims to contain itself
2 qpdf: operation succeeded with warnings; resulting file may have some problems 2 qpdf: operation succeeded with warnings; resulting file may have some problems