summaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDF.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2013-02-23 23:41:27 +0100
committerJay Berkenbilt <ejb@ql.org>2013-02-23 23:51:17 +0100
commit6c7bf114dc0402dfbfaef4586f05dfd398e57e16 (patch)
treeb7cc8bf0e477e3e4fe28f3a20f2f656788e667d8 /libqpdf/QPDF.cc
parent7e7c93951f7d0af4cd249f9bbbcf3d79ac500a7c (diff)
downloadqpdf-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.cc29
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");
+ }
}
}