diff options
author | m-holger <m-holger@kubitscheck.org> | 2024-01-06 15:37:05 +0100 |
---|---|---|
committer | m-holger <m-holger@kubitscheck.org> | 2024-01-07 18:39:40 +0100 |
commit | ba477e0b335ea430451711e125843f7624803ae5 (patch) | |
tree | 863740e5865d1ccbd2df0afbc8a88597d89280d8 /libqpdf/QPDF.cc | |
parent | 61954995983f2881c07c8ea993819c60ff1e6e63 (diff) | |
download | qpdf-ba477e0b335ea430451711e125843f7624803ae5.tar.zst |
Tune QPDF::getCompressibleObjGens
Change set visited to std::vector<bool>
Diffstat (limited to 'libqpdf/QPDF.cc')
-rw-r--r-- | libqpdf/QPDF.cc | 12 |
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() || |