Commit 5754ab8b39646404801931ed065f985efa0b34a7

Authored by m-holger
1 parent aabd3f6f

Tune QPDF::readObjectInStream

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