Commit cf469d789024cdda41684f1ea48b41829b98c242
1 parent
cd830968
Give up reading objects with too many consecutive errors
Showing
6 changed files
with
54 additions
and
147 deletions
ChangeLog
| 1 | +2019-06-15 Jay Berkenbilt <ejb@ql.org> | ||
| 2 | + | ||
| 3 | + * When parsing files, while reading an object, if there are too | ||
| 4 | + many consecutive errors without enough intervening successes, give | ||
| 5 | + up on the specific object. This reduces cases in which very badly | ||
| 6 | + damaged files send qpdf into a tail spin reading one character at | ||
| 7 | + a time and reporting warnings. | ||
| 8 | + | ||
| 1 | 2019-06-13 Jay Berkenbilt <ejb@ql.org> | 9 | 2019-06-13 Jay Berkenbilt <ejb@ql.org> |
| 2 | 10 | ||
| 3 | * Perform initial integration of Google's oss-fuzz project by | 11 | * Perform initial integration of Google's oss-fuzz project by |
libqpdf/QPDFObjectHandle.cc
| @@ -1628,8 +1628,11 @@ QPDFObjectHandle::parseInternal(PointerHolder<InputSource> input, | @@ -1628,8 +1628,11 @@ QPDFObjectHandle::parseInternal(PointerHolder<InputSource> input, | ||
| 1628 | qpdf_offset_t offset = input->tell(); | 1628 | qpdf_offset_t offset = input->tell(); |
| 1629 | offset_stack.push_back(offset); | 1629 | offset_stack.push_back(offset); |
| 1630 | bool done = false; | 1630 | bool done = false; |
| 1631 | + int bad_count = 0; | ||
| 1632 | + int good_count = 0; | ||
| 1631 | while (! done) | 1633 | while (! done) |
| 1632 | { | 1634 | { |
| 1635 | + bool bad = false; | ||
| 1633 | std::vector<QPDFObjectHandle>& olist = olist_stack.back(); | 1636 | std::vector<QPDFObjectHandle>& olist = olist_stack.back(); |
| 1634 | parser_state_e state = state_stack.back(); | 1637 | parser_state_e state = state_stack.back(); |
| 1635 | offset = offset_stack.back(); | 1638 | offset = offset_stack.back(); |
| @@ -1651,6 +1654,7 @@ QPDFObjectHandle::parseInternal(PointerHolder<InputSource> input, | @@ -1651,6 +1654,7 @@ QPDFObjectHandle::parseInternal(PointerHolder<InputSource> input, | ||
| 1651 | input->getLastOffset(), | 1654 | input->getLastOffset(), |
| 1652 | "unexpected EOF")); | 1655 | "unexpected EOF")); |
| 1653 | } | 1656 | } |
| 1657 | + bad = true; | ||
| 1654 | state = st_eof; | 1658 | state = st_eof; |
| 1655 | break; | 1659 | break; |
| 1656 | 1660 | ||
| @@ -1661,6 +1665,7 @@ QPDFObjectHandle::parseInternal(PointerHolder<InputSource> input, | @@ -1661,6 +1665,7 @@ QPDFObjectHandle::parseInternal(PointerHolder<InputSource> input, | ||
| 1661 | object_description, | 1665 | object_description, |
| 1662 | input->getLastOffset(), | 1666 | input->getLastOffset(), |
| 1663 | token.getErrorMessage())); | 1667 | token.getErrorMessage())); |
| 1668 | + bad = true; | ||
| 1664 | object = newNull(); | 1669 | object = newNull(); |
| 1665 | break; | 1670 | break; |
| 1666 | 1671 | ||
| @@ -1672,6 +1677,7 @@ QPDFObjectHandle::parseInternal(PointerHolder<InputSource> input, | @@ -1672,6 +1677,7 @@ QPDFObjectHandle::parseInternal(PointerHolder<InputSource> input, | ||
| 1672 | object_description, | 1677 | object_description, |
| 1673 | input->getLastOffset(), | 1678 | input->getLastOffset(), |
| 1674 | "treating unexpected brace token as null")); | 1679 | "treating unexpected brace token as null")); |
| 1680 | + bad = true; | ||
| 1675 | object = newNull(); | 1681 | object = newNull(); |
| 1676 | break; | 1682 | break; |
| 1677 | 1683 | ||
| @@ -1688,6 +1694,7 @@ QPDFObjectHandle::parseInternal(PointerHolder<InputSource> input, | @@ -1688,6 +1694,7 @@ QPDFObjectHandle::parseInternal(PointerHolder<InputSource> input, | ||
| 1688 | object_description, | 1694 | object_description, |
| 1689 | input->getLastOffset(), | 1695 | input->getLastOffset(), |
| 1690 | "treating unexpected array close token as null")); | 1696 | "treating unexpected array close token as null")); |
| 1697 | + bad = true; | ||
| 1691 | object = newNull(); | 1698 | object = newNull(); |
| 1692 | } | 1699 | } |
| 1693 | break; | 1700 | break; |
| @@ -1705,6 +1712,7 @@ QPDFObjectHandle::parseInternal(PointerHolder<InputSource> input, | @@ -1705,6 +1712,7 @@ QPDFObjectHandle::parseInternal(PointerHolder<InputSource> input, | ||
| 1705 | object_description, | 1712 | object_description, |
| 1706 | input->getLastOffset(), | 1713 | input->getLastOffset(), |
| 1707 | "unexpected dictionary close token")); | 1714 | "unexpected dictionary close token")); |
| 1715 | + bad = true; | ||
| 1708 | object = newNull(); | 1716 | object = newNull(); |
| 1709 | } | 1717 | } |
| 1710 | break; | 1718 | break; |
| @@ -1719,6 +1727,7 @@ QPDFObjectHandle::parseInternal(PointerHolder<InputSource> input, | @@ -1719,6 +1727,7 @@ QPDFObjectHandle::parseInternal(PointerHolder<InputSource> input, | ||
| 1719 | object_description, | 1727 | object_description, |
| 1720 | input->getLastOffset(), | 1728 | input->getLastOffset(), |
| 1721 | "ignoring excessively deeply nested data structure")); | 1729 | "ignoring excessively deeply nested data structure")); |
| 1730 | + bad = true; | ||
| 1722 | object = newNull(); | 1731 | object = newNull(); |
| 1723 | state = st_top; | 1732 | state = st_top; |
| 1724 | } | 1733 | } |
| @@ -1800,6 +1809,7 @@ QPDFObjectHandle::parseInternal(PointerHolder<InputSource> input, | @@ -1800,6 +1809,7 @@ QPDFObjectHandle::parseInternal(PointerHolder<InputSource> input, | ||
| 1800 | input->getLastOffset(), | 1809 | input->getLastOffset(), |
| 1801 | "unknown token while reading object;" | 1810 | "unknown token while reading object;" |
| 1802 | " treating as string")); | 1811 | " treating as string")); |
| 1812 | + bad = true; | ||
| 1803 | object = newString(value); | 1813 | object = newString(value); |
| 1804 | } | 1814 | } |
| 1805 | } | 1815 | } |
| @@ -1824,6 +1834,7 @@ QPDFObjectHandle::parseInternal(PointerHolder<InputSource> input, | @@ -1824,6 +1834,7 @@ QPDFObjectHandle::parseInternal(PointerHolder<InputSource> input, | ||
| 1824 | input->getLastOffset(), | 1834 | input->getLastOffset(), |
| 1825 | "treating unknown token type as null while " | 1835 | "treating unknown token type as null while " |
| 1826 | "reading object")); | 1836 | "reading object")); |
| 1837 | + bad = true; | ||
| 1827 | object = newNull(); | 1838 | object = newNull(); |
| 1828 | break; | 1839 | break; |
| 1829 | } | 1840 | } |
| @@ -1839,6 +1850,32 @@ QPDFObjectHandle::parseInternal(PointerHolder<InputSource> input, | @@ -1839,6 +1850,32 @@ QPDFObjectHandle::parseInternal(PointerHolder<InputSource> input, | ||
| 1839 | object = newNull(); | 1850 | object = newNull(); |
| 1840 | } | 1851 | } |
| 1841 | 1852 | ||
| 1853 | + if (bad) | ||
| 1854 | + { | ||
| 1855 | + ++bad_count; | ||
| 1856 | + good_count = 0; | ||
| 1857 | + } | ||
| 1858 | + else | ||
| 1859 | + { | ||
| 1860 | + ++good_count; | ||
| 1861 | + if (good_count > 3) | ||
| 1862 | + { | ||
| 1863 | + bad_count = 0; | ||
| 1864 | + } | ||
| 1865 | + } | ||
| 1866 | + if (bad_count > 5) | ||
| 1867 | + { | ||
| 1868 | + // We had too many consecutive errors without enough | ||
| 1869 | + // intervening successful objects. Give up. | ||
| 1870 | + warn(context, | ||
| 1871 | + QPDFExc(qpdf_e_damaged_pdf, input->getName(), | ||
| 1872 | + object_description, | ||
| 1873 | + input->getLastOffset(), | ||
| 1874 | + "too many errors; giving up on reading object")); | ||
| 1875 | + state = st_top; | ||
| 1876 | + object = newNull(); | ||
| 1877 | + } | ||
| 1878 | + | ||
| 1842 | switch (state) | 1879 | switch (state) |
| 1843 | { | 1880 | { |
| 1844 | case st_eof: | 1881 | case st_eof: |
qpdf/qtest/qpdf.test
| @@ -624,7 +624,7 @@ my @bug_tests = ( | @@ -624,7 +624,7 @@ my @bug_tests = ( | ||
| 624 | ["99", "object 0", 2], | 624 | ["99", "object 0", 2], |
| 625 | ["99b", "object 0", 2], | 625 | ["99b", "object 0", 2], |
| 626 | ["100", "xref reconstruction loop", 2], | 626 | ["100", "xref reconstruction loop", 2], |
| 627 | - ["101", "resolve for exception text", 3], | 627 | + ["101", "resolve for exception text", 2], |
| 628 | ["117", "other infinite loop", 2], | 628 | ["117", "other infinite loop", 2], |
| 629 | ["118", "other infinite loop", 2], | 629 | ["118", "other infinite loop", 2], |
| 630 | ["119", "other infinite loop", 3], | 630 | ["119", "other infinite loop", 3], |
| @@ -639,7 +639,7 @@ my @bug_tests = ( | @@ -639,7 +639,7 @@ my @bug_tests = ( | ||
| 639 | ["149", "xref prev pointer loop", 3], | 639 | ["149", "xref prev pointer loop", 3], |
| 640 | ["150", "integer overflow", 2], | 640 | ["150", "integer overflow", 2], |
| 641 | ["202", "even more deeply nested dictionary", 2], | 641 | ["202", "even more deeply nested dictionary", 2], |
| 642 | - ["263", "empty xref stream", 3], | 642 | + ["263", "empty xref stream", 2], |
| 643 | ); | 643 | ); |
| 644 | $n_tests += scalar(@bug_tests); | 644 | $n_tests += scalar(@bug_tests); |
| 645 | foreach my $d (@bug_tests) | 645 | foreach my $d (@bug_tests) |
qpdf/qtest/qpdf/issue-100.out
| @@ -7,10 +7,8 @@ WARNING: issue-100.pdf (object 5 0, offset 289): unknown token while reading obj | @@ -7,10 +7,8 @@ WARNING: issue-100.pdf (object 5 0, offset 289): unknown token while reading obj | ||
| 7 | WARNING: issue-100.pdf (object 5 0, offset 294): unknown token while reading object; treating as string | 7 | WARNING: issue-100.pdf (object 5 0, offset 294): unknown token while reading object; treating as string |
| 8 | WARNING: issue-100.pdf (object 5 0, offset 297): unknown token while reading object; treating as string | 8 | WARNING: issue-100.pdf (object 5 0, offset 297): unknown token while reading object; treating as string |
| 9 | WARNING: issue-100.pdf (object 5 0, offset 304): unknown token while reading object; treating as string | 9 | WARNING: issue-100.pdf (object 5 0, offset 304): unknown token while reading object; treating as string |
| 10 | -WARNING: issue-100.pdf (object 5 0, offset 308): unexpected ) | ||
| 11 | -WARNING: issue-100.pdf (object 5 0, offset 316): treating unexpected array close token as null | ||
| 12 | -WARNING: issue-100.pdf (object 5 0, offset 227): expected dictionary key but found non-name object; inserting key /QPDFFake1 | ||
| 13 | -WARNING: issue-100.pdf (object 5 0, offset 321): expected endobj | 10 | +WARNING: issue-100.pdf (object 5 0, offset 304): too many errors; giving up on reading object |
| 11 | +WARNING: issue-100.pdf (object 5 0, offset 308): expected endobj | ||
| 14 | WARNING: issue-100.pdf (object 5 0, offset 418): /Length key in stream dictionary is not an integer | 12 | WARNING: issue-100.pdf (object 5 0, offset 418): /Length key in stream dictionary is not an integer |
| 15 | WARNING: issue-100.pdf (object 5 0, offset 489): attempting to recover stream length | 13 | WARNING: issue-100.pdf (object 5 0, offset 489): attempting to recover stream length |
| 16 | WARNING: issue-100.pdf (object 5 0, offset 489): recovered stream length: 12 | 14 | WARNING: issue-100.pdf (object 5 0, offset 489): recovered stream length: 12 |
qpdf/qtest/qpdf/issue-101.out
| @@ -38,116 +38,6 @@ WARNING: issue-101.pdf (object 11 0, offset 626): unknown token while reading ob | @@ -38,116 +38,6 @@ WARNING: issue-101.pdf (object 11 0, offset 626): unknown token while reading ob | ||
| 38 | WARNING: issue-101.pdf (object 11 0, offset 637): unknown token while reading object; treating as string | 38 | WARNING: issue-101.pdf (object 11 0, offset 637): unknown token while reading object; treating as string |
| 39 | WARNING: issue-101.pdf (object 11 0, offset 639): unknown token while reading object; treating as string | 39 | WARNING: issue-101.pdf (object 11 0, offset 639): unknown token while reading object; treating as string |
| 40 | WARNING: issue-101.pdf (object 11 0, offset 644): unknown token while reading object; treating as string | 40 | WARNING: issue-101.pdf (object 11 0, offset 644): unknown token while reading object; treating as string |
| 41 | -WARNING: issue-101.pdf (object 11 0, offset 647): unknown token while reading object; treating as string | ||
| 42 | -WARNING: issue-101.pdf (object 11 0, offset 687): unknown token while reading object; treating as string | ||
| 43 | -WARNING: issue-101.pdf (object 11 0, offset 691): unknown token while reading object; treating as string | ||
| 44 | -WARNING: issue-101.pdf (object 11 0, offset 696): unknown token while reading object; treating as string | ||
| 45 | -WARNING: issue-101.pdf (object 11 0, offset 698): unknown token while reading object; treating as string | ||
| 46 | -WARNING: issue-101.pdf (object 11 0, offset 701): unknown token while reading object; treating as string | ||
| 47 | -WARNING: issue-101.pdf (object 11 0, offset 711): unknown token while reading object; treating as string | ||
| 48 | -WARNING: issue-101.pdf (object 11 0, offset 743): unknown token while reading object; treating as string | ||
| 49 | -WARNING: issue-101.pdf (object 11 0, offset 745): unknown token while reading object; treating as string | ||
| 50 | -WARNING: issue-101.pdf (object 11 0, offset 747): unknown token while reading object; treating as string | ||
| 51 | -WARNING: issue-101.pdf (object 11 0, offset 777): unknown token while reading object; treating as string | ||
| 52 | -WARNING: issue-101.pdf (object 11 0, offset 790): unknown token while reading object; treating as string | ||
| 53 | -WARNING: issue-101.pdf (object 11 0, offset 800): treating unexpected brace token as null | ||
| 54 | -WARNING: issue-101.pdf (object 11 0, offset 801): unknown token while reading object; treating as string | ||
| 55 | -WARNING: issue-101.pdf (object 11 0, offset 811): unknown token while reading object; treating as string | ||
| 56 | -WARNING: issue-101.pdf (object 11 0, offset 819): unknown token while reading object; treating as string | ||
| 57 | -WARNING: issue-101.pdf (object 11 0, offset 832): unknown token while reading object; treating as string | ||
| 58 | -WARNING: issue-101.pdf (object 11 0, offset 856): unexpected > | ||
| 59 | -WARNING: issue-101.pdf (object 11 0, offset 857): unknown token while reading object; treating as string | ||
| 60 | -WARNING: issue-101.pdf (object 11 0, offset 868): unknown token while reading object; treating as string | ||
| 61 | -WARNING: issue-101.pdf (object 11 0, offset 887): unknown token while reading object; treating as string | ||
| 62 | -WARNING: issue-101.pdf (object 11 0, offset 897): unexpected ) | ||
| 63 | -WARNING: issue-101.pdf (object 11 0, offset 898): unknown token while reading object; treating as string | ||
| 64 | -WARNING: issue-101.pdf (object 11 0, offset 909): invalid character (ยค) in hexstring | ||
| 65 | -WARNING: issue-101.pdf (object 11 0, offset 911): unknown token while reading object; treating as string | ||
| 66 | -WARNING: issue-101.pdf (object 11 0, offset 929): unknown token while reading object; treating as string | ||
| 67 | -WARNING: issue-101.pdf (object 11 0, offset 930): invalid character (ยฒ) in hexstring | ||
| 68 | -WARNING: issue-101.pdf (object 11 0, offset 932): unknown token while reading object; treating as string | ||
| 69 | -WARNING: issue-101.pdf (object 11 0, offset 944): unknown token while reading object; treating as string | ||
| 70 | -WARNING: issue-101.pdf (object 11 0, offset 947): unknown token while reading object; treating as string | ||
| 71 | -WARNING: issue-101.pdf (object 11 0, offset 970): unknown token while reading object; treating as string | ||
| 72 | -WARNING: issue-101.pdf (object 11 0, offset 1046): unknown token while reading object; treating as string | ||
| 73 | -WARNING: issue-101.pdf (object 11 0, offset 1067): unknown token while reading object; treating as string | ||
| 74 | -WARNING: issue-101.pdf (object 11 0, offset 1075): unknown token while reading object; treating as string | ||
| 75 | -WARNING: issue-101.pdf (object 11 0, offset 1080): unknown token while reading object; treating as string | ||
| 76 | -WARNING: issue-101.pdf (object 11 0, offset 1084): unknown token while reading object; treating as string | ||
| 77 | -WARNING: issue-101.pdf (object 11 0, offset 1102): unknown token while reading object; treating as string | ||
| 78 | -WARNING: issue-101.pdf (object 11 0, offset 1112): unknown token while reading object; treating as string | ||
| 79 | -WARNING: issue-101.pdf (object 11 0, offset 1124): unknown token while reading object; treating as string | ||
| 80 | -WARNING: issue-101.pdf (object 11 0, offset 1133): unknown token while reading object; treating as string | ||
| 81 | -WARNING: issue-101.pdf (object 11 0, offset 1145): unknown token while reading object; treating as string | ||
| 82 | -WARNING: issue-101.pdf (object 11 0, offset 1148): unknown token while reading object; treating as string | ||
| 83 | -WARNING: issue-101.pdf (object 11 0, offset 1150): unknown token while reading object; treating as string | ||
| 84 | -WARNING: issue-101.pdf (object 11 0, offset 1151): unexpected ) | ||
| 85 | -WARNING: issue-101.pdf (object 11 0, offset 1153): unexpected dictionary close token | ||
| 86 | -WARNING: issue-101.pdf (object 11 0, offset 1156): unknown token while reading object; treating as string | ||
| 87 | -WARNING: issue-101.pdf (object 11 0, offset 1163): unknown token while reading object; treating as string | ||
| 88 | -WARNING: issue-101.pdf (object 11 0, offset 1168): unexpected > | ||
| 89 | -WARNING: issue-101.pdf (object 11 0, offset 1170): invalid character (I) in hexstring | ||
| 90 | -WARNING: issue-101.pdf (object 11 0, offset 1167): expected dictionary key but found non-name object; inserting key /QPDFFake1 | ||
| 91 | -WARNING: issue-101.pdf (object 11 0, offset 1167): expected dictionary key but found non-name object; inserting key /QPDFFake2 | ||
| 92 | -WARNING: issue-101.pdf (object 11 0, offset 1167): expected dictionary key but found non-name object; inserting key /QPDFFake3 | ||
| 93 | -WARNING: issue-101.pdf (object 11 0, offset 1176): unknown token while reading object; treating as string | ||
| 94 | -WARNING: issue-101.pdf (object 11 0, offset 1180): unknown token while reading object; treating as string | ||
| 95 | -WARNING: issue-101.pdf (object 11 0, offset 1184): unknown token while reading object; treating as string | ||
| 96 | -WARNING: issue-101.pdf (object 11 0, offset 1190): unexpected > | ||
| 97 | -WARNING: issue-101.pdf (object 11 0, offset 1192): unknown token while reading object; treating as string | ||
| 98 | -WARNING: issue-101.pdf (object 11 0, offset 1195): unknown token while reading object; treating as string | ||
| 99 | -WARNING: issue-101.pdf (object 11 0, offset 1205): unknown token while reading object; treating as string | ||
| 100 | -WARNING: issue-101.pdf (object 11 0, offset 1217): unknown token while reading object; treating as string | ||
| 101 | -WARNING: issue-101.pdf (object 11 0, offset 1224): unknown token while reading object; treating as string | ||
| 102 | -WARNING: issue-101.pdf (object 11 0, offset 1236): unknown token while reading object; treating as string | ||
| 103 | -WARNING: issue-101.pdf (object 11 0, offset 1242): expected dictionary key but found non-name object; inserting key /QPDFFake1 | ||
| 104 | -WARNING: issue-101.pdf (object 11 0, offset 1242): dictionary ended prematurely; using null as value for last key | ||
| 105 | -WARNING: issue-101.pdf (object 11 0, offset 1275): unknown token while reading object; treating as string | ||
| 106 | -WARNING: issue-101.pdf (object 11 0, offset 1287): unknown token while reading object; treating as string | ||
| 107 | -WARNING: issue-101.pdf (object 11 0, offset 1291): unexpected dictionary close token | ||
| 108 | -WARNING: issue-101.pdf (object 11 0, offset 1294): unknown token while reading object; treating as string | ||
| 109 | -WARNING: issue-101.pdf (object 11 0, offset 1306): unknown token while reading object; treating as string | ||
| 110 | -WARNING: issue-101.pdf (object 11 0, offset 1322): unknown token while reading object; treating as string | ||
| 111 | -WARNING: issue-101.pdf (object 11 0, offset 1325): unknown token while reading object; treating as string | ||
| 112 | -WARNING: issue-101.pdf (object 11 0, offset 1329): unknown token while reading object; treating as string | ||
| 113 | -WARNING: issue-101.pdf (object 11 0, offset 1341): treating unexpected array close token as null | ||
| 114 | -WARNING: issue-101.pdf (object 11 0, offset 1312): expected dictionary key but found non-name object; inserting key /QPDFFake1 | ||
| 115 | -WARNING: issue-101.pdf (object 11 0, offset 1312): expected dictionary key but found non-name object; inserting key /QPDFFake2 | ||
| 116 | -WARNING: issue-101.pdf (object 11 0, offset 1312): expected dictionary key but found non-name object; inserting key /QPDFFake3 | ||
| 117 | -WARNING: issue-101.pdf (object 11 0, offset 1312): expected dictionary key but found non-name object; inserting key /QPDFFake4 | ||
| 118 | -WARNING: issue-101.pdf (object 11 0, offset 1312): dictionary ended prematurely; using null as value for last key | ||
| 119 | -WARNING: issue-101.pdf (object 11 0, offset 1349): unknown token while reading object; treating as string | ||
| 120 | -WARNING: issue-101.pdf (object 11 0, offset 1353): unknown token while reading object; treating as string | ||
| 121 | -WARNING: issue-101.pdf (object 11 0, offset 1357): unknown token while reading object; treating as string | ||
| 122 | -WARNING: issue-101.pdf (object 11 0, offset 1359): unknown token while reading object; treating as string | ||
| 123 | -WARNING: issue-101.pdf (object 11 0, offset 1368): unexpected ) | ||
| 124 | -WARNING: issue-101.pdf (object 11 0, offset 1373): expected endobj | ||
| 125 | -WARNING: issue-101.pdf (object 2 0, offset 244): unknown token while reading object; treating as string | ||
| 126 | -WARNING: issue-101.pdf (object 7 0, offset 3855): unknown token while reading object; treating as string | ||
| 127 | -WARNING: issue-101.pdf (object 7 0, offset 3863): treating unexpected brace token as null | ||
| 128 | -WARNING: issue-101.pdf (object 7 0, offset 3864): unknown token while reading object; treating as string | ||
| 129 | -WARNING: issue-101.pdf (object 7 0, offset 3866): unknown token while reading object; treating as string | ||
| 130 | -WARNING: issue-101.pdf (object 7 0, offset 3873): unknown token while reading object; treating as string | ||
| 131 | -WARNING: issue-101.pdf (object 7 0, offset 3879): unknown token while reading object; treating as string | ||
| 132 | -WARNING: issue-101.pdf (object 7 0, offset 3888): unknown token while reading object; treating as string | ||
| 133 | -WARNING: issue-101.pdf (object 7 0, offset 3901): unknown token while reading object; treating as string | ||
| 134 | -WARNING: issue-101.pdf (object 7 0, offset 3905): unknown token while reading object; treating as string | ||
| 135 | -WARNING: issue-101.pdf (object 7 0, offset 3913): unknown token while reading object; treating as string | ||
| 136 | -WARNING: issue-101.pdf (object 7 0, offset 3847): expected dictionary key but found non-name object; inserting key /QPDFFake1 | ||
| 137 | -WARNING: issue-101.pdf (object 7 0, offset 3847): expected dictionary key but found non-name object; inserting key /QPDFFake2 | ||
| 138 | -WARNING: issue-101.pdf (object 7 0, offset 3847): expected dictionary key but found non-name object; inserting key /QPDFFake3 | ||
| 139 | -WARNING: issue-101.pdf (object 7 0, offset 3847): expected dictionary key but found non-name object; inserting key /QPDFFake4 | ||
| 140 | -WARNING: issue-101.pdf (object 7 0, offset 3847): expected dictionary key but found non-name object; inserting key /QPDFFake5 | ||
| 141 | -WARNING: issue-101.pdf (object 7 0, offset 3847): expected dictionary key but found non-name object; inserting key /QPDFFake6 | ||
| 142 | -WARNING: issue-101.pdf (object 7 0, offset 3847): expected dictionary key but found non-name object; inserting key /QPDFFake7 | ||
| 143 | -WARNING: issue-101.pdf (object 7 0, offset 3847): expected dictionary key but found non-name object; inserting key /QPDFFake8 | ||
| 144 | -WARNING: issue-101.pdf (object 7 0, offset 3847): expected dictionary key but found non-name object; inserting key /QPDFFake9 | ||
| 145 | -WARNING: issue-101.pdf (object 7 0, offset 3847): expected dictionary key but found non-name object; inserting key /QPDFFake10 | ||
| 146 | -WARNING: issue-101.pdf (object 7 0, offset 3844): stream dictionary lacks /Length key | ||
| 147 | -WARNING: issue-101.pdf (object 7 0, offset 3962): attempting to recover stream length | ||
| 148 | -WARNING: issue-101.pdf (object 7 0, offset 3962): recovered stream length: 12 | ||
| 149 | -WARNING: issue-101.pdf (object 8 0, offset 4067): invalid character ()) in hexstring | ||
| 150 | -WARNING: issue-101.pdf (object 8 0, offset 4069): expected endobj | ||
| 151 | -WARNING: issue-101.pdf (object 9 0, offset 2832): unknown token while reading object; treating as string | ||
| 152 | -WARNING: issue-101.pdf (object 9 0, offset 2834): expected endobj | ||
| 153 | -qpdf: operation succeeded with warnings; resulting file may have some problems | 41 | +WARNING: issue-101.pdf (object 11 0, offset 644): too many errors; giving up on reading object |
| 42 | +WARNING: issue-101.pdf (object 11 0, offset 647): expected endobj | ||
| 43 | +issue-101.pdf (offset 687): unable to find /Root dictionary |
qpdf/qtest/qpdf/issue-263.out
| @@ -8,31 +8,5 @@ WARNING: issue-263.pdf (trailer, offset 79): unknown token while reading object; | @@ -8,31 +8,5 @@ WARNING: issue-263.pdf (trailer, offset 79): unknown token while reading object; | ||
| 8 | WARNING: issue-263.pdf (trailer, offset 82): unexpected ) | 8 | WARNING: issue-263.pdf (trailer, offset 82): unexpected ) |
| 9 | WARNING: issue-263.pdf (trailer, offset 83): unknown token while reading object; treating as string | 9 | WARNING: issue-263.pdf (trailer, offset 83): unknown token while reading object; treating as string |
| 10 | WARNING: issue-263.pdf (trailer, offset 87): unexpected > | 10 | WARNING: issue-263.pdf (trailer, offset 87): unexpected > |
| 11 | -WARNING: issue-263.pdf (trailer, offset 89): unexpected dictionary close token | ||
| 12 | -WARNING: issue-263.pdf (trailer, offset 92): unexpected > | ||
| 13 | -WARNING: issue-263.pdf (trailer, offset 40): expected dictionary key but found non-name object; inserting key /QPDFFake1 | ||
| 14 | -WARNING: issue-263.pdf (trailer, offset 40): expected dictionary key but found non-name object; inserting key /QPDFFake2 | ||
| 15 | -WARNING: issue-263.pdf (trailer, offset 40): expected dictionary key but found non-name object; inserting key /QPDFFake3 | ||
| 16 | -WARNING: issue-263.pdf (trailer, offset 40): expected dictionary key but found non-name object; inserting key /QPDFFake4 | ||
| 17 | -WARNING: issue-263.pdf (trailer, offset 40): expected dictionary key but found non-name object; inserting key /QPDFFake5 | ||
| 18 | -WARNING: issue-263.pdf (trailer, offset 40): expected dictionary key but found non-name object; inserting key /QPDFFake6 | ||
| 19 | -WARNING: issue-263.pdf (trailer, offset 40): expected dictionary key but found non-name object; inserting key /QPDFFake7 | ||
| 20 | -WARNING: issue-263.pdf (trailer, offset 98): unknown token while reading object; treating as string | ||
| 21 | -WARNING: issue-263.pdf (trailer, offset 103): unexpected ) | ||
| 22 | -WARNING: issue-263.pdf (trailer, offset 107): unknown token while reading object; treating as string | ||
| 23 | -WARNING: issue-263.pdf (trailer, offset 119): expected dictionary key but found non-name object; inserting key /QPDFFake1 | ||
| 24 | -WARNING: issue-263.pdf (trailer, offset 163): unknown token while reading object; treating as string | ||
| 25 | -WARNING: issue-263.pdf (trailer, offset 173): unknown token while reading object; treating as string | ||
| 26 | -WARNING: issue-263.pdf (trailer, offset 113): expected dictionary key but found non-name object; inserting key /QPDFFake1 | ||
| 27 | -WARNING: issue-263.pdf (trailer, offset 113): expected dictionary key but found non-name object; inserting key /QPDFFake2 | ||
| 28 | -WARNING: issue-263.pdf (trailer, offset 113): dictionary ended prematurely; using null as value for last key | ||
| 29 | -WARNING: issue-263.pdf (trailer, offset 18): expected dictionary key but found non-name object; inserting key /QPDFFake1 | ||
| 30 | -WARNING: issue-263.pdf (trailer, offset 18): expected dictionary key but found non-name object; inserting key /QPDFFake2 | ||
| 31 | -WARNING: issue-263.pdf (trailer, offset 18): expected dictionary key but found non-name object; inserting key /QPDFFake3 | ||
| 32 | -WARNING: issue-263.pdf (trailer, offset 18): expected dictionary key but found non-name object; inserting key /QPDFFake4 | ||
| 33 | -WARNING: issue-263.pdf (trailer, offset 18): expected dictionary key but found non-name object; inserting key /QPDFFake5 | ||
| 34 | -WARNING: issue-263.pdf (trailer, offset 18): expected dictionary key but found non-name object; inserting key /QPDFFake6 | ||
| 35 | -WARNING: issue-263.pdf (trailer, offset 18): expected dictionary key but found non-name object; inserting key /QPDFFake7 | ||
| 36 | -WARNING: issue-263.pdf (trailer, offset 18): expected dictionary key but found non-name object; inserting key /QPDFFake8 | ||
| 37 | -WARNING: issue-263.pdf (trailer, offset 18): expected dictionary key but found non-name object; inserting key /QPDFFake9 | ||
| 38 | -qpdf: operation succeeded with warnings; resulting file may have some problems | 11 | +WARNING: issue-263.pdf (trailer, offset 87): too many errors; giving up on reading object |
| 12 | +issue-263.pdf: unable to find trailer dictionary while recovering damaged file |