aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDF.cc
diff options
context:
space:
mode:
authorm-holger <m-holger@kubitscheck.org>2024-01-06 15:37:05 +0100
committerm-holger <m-holger@kubitscheck.org>2024-01-07 18:39:40 +0100
commitba477e0b335ea430451711e125843f7624803ae5 (patch)
tree863740e5865d1ccbd2df0afbc8a88597d89280d8 /libqpdf/QPDF.cc
parent61954995983f2881c07c8ea993819c60ff1e6e63 (diff)
downloadqpdf-ba477e0b335ea430451711e125843f7624803ae5.tar.zst
Tune QPDF::getCompressibleObjGens
Change set visited to std::vector<bool>
Diffstat (limited to 'libqpdf/QPDF.cc')
-rw-r--r--libqpdf/QPDF.cc12
1 files changed, 9 insertions, 3 deletions
diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc
index 2b1ca4fe..4ed5d852 100644
--- a/libqpdf/QPDF.cc
+++ b/libqpdf/QPDF.cc
@@ -2376,20 +2376,26 @@ QPDF::getCompressibleObjGens()
QPDFObjectHandle encryption_dict = m->trailer.getKey("/Encrypt");
QPDFObjGen encryption_dict_og = encryption_dict.getObjGen();
- QPDFObjGen::set visited;
+ const size_t max_obj = getObjectCount();
+ std::vector<bool> visited(max_obj, false);
std::vector<QPDFObjectHandle> queue;
queue.reserve(512);
queue.push_back(m->trailer);
std::vector<QPDFObjGen> result;
while (!queue.empty()) {
- QPDFObjectHandle obj = queue.back();
+ auto obj = queue.back();
queue.pop_back();
if (obj.isIndirect()) {
QPDFObjGen og = obj.getObjGen();
- if (!visited.add(og)) {
+ const size_t id = toS(og.getObj() - 1);
+ if (id >= max_obj)
+ throw std::runtime_error(
+ "unexpected object id encountered in getCompressibleObjGens");
+ if (visited[id]) {
QTC::TC("qpdf", "QPDF loop detected traversing objects");
continue;
}
+ visited[id] = true;
if (og == encryption_dict_og) {
QTC::TC("qpdf", "QPDF exclude encryption dictionary");
} else if (!(obj.isStream() ||