diff options
author | Jay Berkenbilt <ejb@ql.org> | 2013-02-23 23:41:27 +0100 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2013-02-23 23:51:17 +0100 |
commit | 6c7bf114dc0402dfbfaef4586f05dfd398e57e16 (patch) | |
tree | b7cc8bf0e477e3e4fe28f3a20f2f656788e667d8 /libqpdf/QPDF.cc | |
parent | 7e7c93951f7d0af4cd249f9bbbcf3d79ac500a7c (diff) | |
download | qpdf-6c7bf114dc0402dfbfaef4586f05dfd398e57e16.tar.zst |
Bug fix: properly handle overridden compressed objects
When caching objects in an object stream, only cache objects that
still resolve to that stream. See Changelog mod from this commit for
details.
Diffstat (limited to 'libqpdf/QPDF.cc')
-rw-r--r-- | libqpdf/QPDF.cc | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 5ee043b9..5860fb11 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -1538,20 +1538,31 @@ QPDF::resolveObjectsInStream(int obj_stream_number) offsets[num] = offset + first; } + // To avoid having to read the object stream multiple times, store + // all objects that would be found here in the cache. Remember + // that some objects stored here might have been overridden by new + // objects appended to the file, so it is necessary to recheck the + // xref table and only cache what would actually be resolved here. for (std::map<int, int>::iterator iter = offsets.begin(); iter != offsets.end(); ++iter) { int obj = (*iter).first; - int offset = (*iter).second; - input->seek(offset, SEEK_SET); - QPDFObjectHandle oh = readObject(input, "", obj, 0, true); - - // Store in cache ObjGen og(obj, 0); - - this->obj_cache[og] = - ObjCache(QPDFObjectHandle::ObjAccessor::getObject(oh), - end_before_space, end_after_space); + QPDFXRefEntry const& entry = this->xref_table[og]; + if ((entry.getType() == 2) && + (entry.getObjStreamNumber() == obj_stream_number)) + { + int offset = (*iter).second; + input->seek(offset, SEEK_SET); + QPDFObjectHandle oh = readObject(input, "", obj, 0, true); + this->obj_cache[og] = + ObjCache(QPDFObjectHandle::ObjAccessor::getObject(oh), + end_before_space, end_after_space); + } + else + { + QTC::TC("qpdf", "QPDF not caching overridden objstm object"); + } } } |