From ba477e0b335ea430451711e125843f7624803ae5 Mon Sep 17 00:00:00 2001 From: m-holger Date: Sat, 6 Jan 2024 14:37:05 +0000 Subject: Tune QPDF::getCompressibleObjGens Change set visited to std::vector --- libqpdf/QPDF.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'libqpdf') 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 visited(max_obj, false); std::vector queue; queue.reserve(512); queue.push_back(m->trailer); std::vector 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() || -- cgit v1.2.3-70-g09d2