Commit 5754ab8b39646404801931ed065f985efa0b34a7

Authored by m-holger
1 parent aabd3f6f

Tune QPDF::readObjectInStream

include/qpdf/QPDF.hh
... ... @@ -1010,7 +1010,7 @@ class QPDF
1010 1010 QPDFObjectHandle readObject(std::string const& description, QPDFObjGen og);
1011 1011 void readStream(QPDFObjectHandle& object, QPDFObjGen og, qpdf_offset_t offset);
1012 1012 void validateStreamLineEnd(QPDFObjectHandle& object, QPDFObjGen og, qpdf_offset_t offset);
1013   - QPDFObjectHandle readObjectInStream(std::shared_ptr<InputSource>, QPDFObjGen og);
  1013 + QPDFObjectHandle readObjectInStream(std::shared_ptr<InputSource>& input, int obj);
1014 1014 size_t recoverStreamLength(
1015 1015 std::shared_ptr<InputSource> input, QPDFObjGen const& og, qpdf_offset_t stream_offset);
1016 1016 QPDFTokenizer::Token readToken(std::shared_ptr<InputSource>, size_t max_len = 0);
... ...
libqpdf/QPDF.cc
... ... @@ -1413,10 +1413,11 @@ QPDF::validateStreamLineEnd(QPDFObjectHandle&amp; object, QPDFObjGen og, qpdf_offset
1413 1413 }
1414 1414  
1415 1415 QPDFObjectHandle
1416   -QPDF::readObjectInStream(std::shared_ptr<InputSource> input, QPDFObjGen og)
  1416 +QPDF::readObjectInStream(std::shared_ptr<InputSource>& input, int obj)
1417 1417 {
1418   - setLastObjectDescription("", og);
1419   - qpdf_offset_t offset = input->tell();
  1418 + m->last_object_description.erase(7); // last_object_description starts with "object "
  1419 + m->last_object_description += std::to_string(obj);
  1420 + m->last_object_description += " 0";
1420 1421  
1421 1422 bool empty = false;
1422 1423 auto object = QPDFParser(input, m->last_object_description, m->tokenizer, nullptr, this)
... ... @@ -1426,9 +1427,6 @@ QPDF::readObjectInStream(std::shared_ptr&lt;InputSource&gt; input, QPDFObjGen og)
1426 1427 // actual PDF files and Adobe Reader appears to ignore them.
1427 1428 warn(damagedPDF(input, input->getLastOffset(), "empty object treated as null"));
1428 1429 }
1429   -
1430   - // Override last_offset so that it points to the beginning of the object we just read
1431   - input->setLastOffset(offset);
1432 1430 return object;
1433 1431 }
1434 1432  
... ... @@ -1787,13 +1785,15 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
1787 1785 // found here in the cache. Remember that some objects stored here might have been overridden
1788 1786 // by new objects appended to the file, so it is necessary to recheck the xref table and only
1789 1787 // cache what would actually be resolved here.
  1788 + m->last_object_description.clear();
  1789 + m->last_object_description += "object ";
1790 1790 for (auto const& iter: offsets) {
1791 1791 QPDFObjGen og(iter.first, 0);
1792 1792 QPDFXRefEntry const& entry = m->xref_table[og];
1793 1793 if ((entry.getType() == 2) && (entry.getObjStreamNumber() == obj_stream_number)) {
1794 1794 int offset = iter.second;
1795 1795 input->seek(offset, SEEK_SET);
1796   - QPDFObjectHandle oh = readObjectInStream(input, og);
  1796 + QPDFObjectHandle oh = readObjectInStream(input, iter.first);
1797 1797 updateCache(og, oh.getObj(), end_before_space, end_after_space);
1798 1798 } else {
1799 1799 QTC::TC("qpdf", "QPDF not caching overridden objstm object");
... ...