Commit ba477e0b335ea430451711e125843f7624803ae5

Authored by m-holger
1 parent 61954995

Tune QPDF::getCompressibleObjGens

Change set visited to std::vector<bool>
Showing 1 changed file with 9 additions and 3 deletions
libqpdf/QPDF.cc
@@ -2376,20 +2376,26 @@ QPDF::getCompressibleObjGens() @@ -2376,20 +2376,26 @@ QPDF::getCompressibleObjGens()
2376 QPDFObjectHandle encryption_dict = m->trailer.getKey("/Encrypt"); 2376 QPDFObjectHandle encryption_dict = m->trailer.getKey("/Encrypt");
2377 QPDFObjGen encryption_dict_og = encryption_dict.getObjGen(); 2377 QPDFObjGen encryption_dict_og = encryption_dict.getObjGen();
2378 2378
2379 - QPDFObjGen::set visited; 2379 + const size_t max_obj = getObjectCount();
  2380 + std::vector<bool> visited(max_obj, false);
2380 std::vector<QPDFObjectHandle> queue; 2381 std::vector<QPDFObjectHandle> queue;
2381 queue.reserve(512); 2382 queue.reserve(512);
2382 queue.push_back(m->trailer); 2383 queue.push_back(m->trailer);
2383 std::vector<QPDFObjGen> result; 2384 std::vector<QPDFObjGen> result;
2384 while (!queue.empty()) { 2385 while (!queue.empty()) {
2385 - QPDFObjectHandle obj = queue.back(); 2386 + auto obj = queue.back();
2386 queue.pop_back(); 2387 queue.pop_back();
2387 if (obj.isIndirect()) { 2388 if (obj.isIndirect()) {
2388 QPDFObjGen og = obj.getObjGen(); 2389 QPDFObjGen og = obj.getObjGen();
2389 - if (!visited.add(og)) { 2390 + const size_t id = toS(og.getObj() - 1);
  2391 + if (id >= max_obj)
  2392 + throw std::runtime_error(
  2393 + "unexpected object id encountered in getCompressibleObjGens");
  2394 + if (visited[id]) {
2390 QTC::TC("qpdf", "QPDF loop detected traversing objects"); 2395 QTC::TC("qpdf", "QPDF loop detected traversing objects");
2391 continue; 2396 continue;
2392 } 2397 }
  2398 + visited[id] = true;
2393 if (og == encryption_dict_og) { 2399 if (og == encryption_dict_og) {
2394 QTC::TC("qpdf", "QPDF exclude encryption dictionary"); 2400 QTC::TC("qpdf", "QPDF exclude encryption dictionary");
2395 } else if (!(obj.isStream() || 2401 } else if (!(obj.isStream() ||