From 6c7bf114dc0402dfbfaef4586f05dfd398e57e16 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 23 Feb 2013 17:41:27 -0500 Subject: 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. --- libqpdf/QPDF.cc | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) (limited to 'libqpdf') 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::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"); + } } } -- cgit v1.2.3-70-g09d2