Commit 1bce5c4ff95ee420f3459891d6496c40d413d4bf

Authored by m-holger
1 parent 95a45263

Fix object stream error/warning messages reporting wrong object id

This was due to the use of last_object_description, which is not set for
the object stream itself.

Also, modify the messages introduced #1391 and #1392 to report the supposed
offset of the objects.
libqpdf/QPDF_objects.cc
@@ -1613,6 +1613,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number) @@ -1613,6 +1613,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
1613 QPDFObjectHandle obj_stream = getObjectByID(obj_stream_number, 0); 1613 QPDFObjectHandle obj_stream = getObjectByID(obj_stream_number, 0);
1614 if (!obj_stream.isStream()) { 1614 if (!obj_stream.isStream()) {
1615 throw damagedPDF( 1615 throw damagedPDF(
  1616 + "object " + std::to_string(obj_stream_number) + " 0",
1616 "supposed object stream " + std::to_string(obj_stream_number) + " is not a stream"); 1617 "supposed object stream " + std::to_string(obj_stream_number) + " is not a stream");
1617 } 1618 }
1618 1619
@@ -1626,12 +1627,14 @@ QPDF::resolveObjectsInStream(int obj_stream_number) @@ -1626,12 +1627,14 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
1626 if (!dict.isDictionaryOfType("/ObjStm")) { 1627 if (!dict.isDictionaryOfType("/ObjStm")) {
1627 QTC::TC("qpdf", "QPDF ERR object stream with wrong type"); 1628 QTC::TC("qpdf", "QPDF ERR object stream with wrong type");
1628 warn(damagedPDF( 1629 warn(damagedPDF(
  1630 + "object " + std::to_string(obj_stream_number) + " 0",
1629 "supposed object stream " + std::to_string(obj_stream_number) + " has wrong type")); 1631 "supposed object stream " + std::to_string(obj_stream_number) + " has wrong type"));
1630 } 1632 }
1631 1633
1632 if (!(dict.getKey("/N").isInteger() && dict.getKey("/First").isInteger())) { 1634 if (!(dict.getKey("/N").isInteger() && dict.getKey("/First").isInteger())) {
1633 throw damagedPDF( 1635 throw damagedPDF(
1634 - ("object stream " + std::to_string(obj_stream_number) + " has incorrect keys")); 1636 + "object " + std::to_string(obj_stream_number) + " 0",
  1637 + "object stream " + std::to_string(obj_stream_number) + " has incorrect keys");
1635 } 1638 }
1636 1639
1637 int n = dict.getKey("/N").getIntValueAsInt(); 1640 int n = dict.getKey("/N").getIntValueAsInt();
@@ -1653,7 +1656,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number) @@ -1653,7 +1656,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
1653 if (!(tnum.isInteger() && toffset.isInteger())) { 1656 if (!(tnum.isInteger() && toffset.isInteger())) {
1654 throw damagedPDF( 1657 throw damagedPDF(
1655 *input, 1658 *input,
1656 - m->last_object_description, 1659 + "object " + std::to_string(obj_stream_number) + " 0",
1657 input->getLastOffset(), 1660 input->getLastOffset(),
1658 "expected integer in object stream header"); 1661 "expected integer in object stream header");
1659 } 1662 }
@@ -1665,7 +1668,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number) @@ -1665,7 +1668,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
1665 QTC::TC("qpdf", "QPDF ignore self-referential object stream"); 1668 QTC::TC("qpdf", "QPDF ignore self-referential object stream");
1666 warn(damagedPDF( 1669 warn(damagedPDF(
1667 *input, 1670 *input,
1668 - m->last_object_description, 1671 + "object " + std::to_string(obj_stream_number) + " 0",
1669 input->getLastOffset(), 1672 input->getLastOffset(),
1670 "object stream claims to contain itself")); 1673 "object stream claims to contain itself"));
1671 continue; 1674 continue;
@@ -1675,8 +1678,8 @@ QPDF::resolveObjectsInStream(int obj_stream_number) @@ -1675,8 +1678,8 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
1675 QTC::TC("qpdf", "QPDF object stream contains id < 1"); 1678 QTC::TC("qpdf", "QPDF object stream contains id < 1");
1676 warn(damagedPDF( 1679 warn(damagedPDF(
1677 *input, 1680 *input,
1678 - "object "s + std::to_string(num) + " 0, offset " + std::to_string(offset),  
1679 - 0, 1681 + "object " + std::to_string(num) + " 0",
  1682 + input->getLastOffset(),
1680 "object id is invalid"s)); 1683 "object id is invalid"s));
1681 continue; 1684 continue;
1682 } 1685 }
@@ -1685,8 +1688,8 @@ QPDF::resolveObjectsInStream(int obj_stream_number) @@ -1685,8 +1688,8 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
1685 QTC::TC("qpdf", "QPDF object stream offsets not increasing"); 1688 QTC::TC("qpdf", "QPDF object stream offsets not increasing");
1686 warn(damagedPDF( 1689 warn(damagedPDF(
1687 *input, 1690 *input,
1688 - "object "s + std::to_string(num) + " 0, offset " + std::to_string(offset),  
1689 - 0, 1691 + "object " + std::to_string(num) + " 0",
  1692 + offset,
1690 "offset is invalid (must be larger than previous offset " + 1693 "offset is invalid (must be larger than previous offset " +
1691 std::to_string(last_offset) + ")")); 1694 std::to_string(last_offset) + ")"));
1692 continue; 1695 continue;
manual/release-notes.rst
@@ -21,6 +21,9 @@ more detail. @@ -21,6 +21,9 @@ more detail.
21 integer object. Previously the method returned false if the first 21 integer object. Previously the method returned false if the first
22 dictionary object was not a linearization parameter dictionary. 22 dictionary object was not a linearization parameter dictionary.
23 23
  24 + - Fix two object stream error/warning messages that reported the wrong
  25 + object id.
  26 +
24 - Other enhancements 27 - Other enhancements
25 28
26 - There have been further enhancements to how files with damaged xref 29 - There have been further enhancements to how files with damaged xref
qpdf/qtest/qpdf/fuzz-16214.out
@@ -16,8 +16,8 @@ WARNING: fuzz-16214.pdf (object 1 0, offset 7189): expected n n obj @@ -16,8 +16,8 @@ WARNING: fuzz-16214.pdf (object 1 0, offset 7189): expected n n obj
16 WARNING: fuzz-16214.pdf: Attempting to reconstruct cross-reference table 16 WARNING: fuzz-16214.pdf: Attempting to reconstruct cross-reference table
17 WARNING: fuzz-16214.pdf (offset 7207): error decoding stream data for object 2 0: stream inflate: inflate: data: invalid code lengths set 17 WARNING: fuzz-16214.pdf (offset 7207): error decoding stream data for object 2 0: stream inflate: inflate: data: invalid code lengths set
18 WARNING: fuzz-16214.pdf (offset 7207): getStreamData called on unfilterable stream 18 WARNING: fuzz-16214.pdf (offset 7207): getStreamData called on unfilterable stream
19 -WARNING: fuzz-16214.pdf (object 7 0, offset 7207): supposed object stream 5 has wrong type  
20 -WARNING: fuzz-16214.pdf (object 7 0, offset 7207): object stream 5 has incorrect keys 19 +WARNING: fuzz-16214.pdf (object 5 0, offset 7207): supposed object stream 5 has wrong type
  20 +WARNING: fuzz-16214.pdf (object 5 0, offset 7207): object stream 5 has incorrect keys
21 WARNING: fuzz-16214.pdf (object 21 0, offset 3639): expected endstream 21 WARNING: fuzz-16214.pdf (object 21 0, offset 3639): expected endstream
22 WARNING: fuzz-16214.pdf (object 21 0, offset 3112): attempting to recover stream length 22 WARNING: fuzz-16214.pdf (object 21 0, offset 3112): attempting to recover stream length
23 WARNING: fuzz-16214.pdf (object 21 0, offset 3112): recovered stream length: 340 23 WARNING: fuzz-16214.pdf (object 21 0, offset 3112): recovered stream length: 340
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 0): object id is invalid  
18 -WARNING: issue-143.pdf object stream 1 (object 0 0, offset 0): object id is invalid  
19 -WARNING: issue-143.pdf object stream 1 (object 6 0, offset 0): offset is invalid (must be larger than previous offset 0)  
20 -WARNING: issue-143.pdf object stream 1 (object 0 0, offset 0): object id is invalid 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
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