Commit df61f3a6c62487ee4e4208cca473b763a2140cee

Authored by Jay Berkenbilt
1 parent ba477e0b

Improve getCompressibleObjGens fix to handle gen > 0

Showing 1 changed file with 9 additions and 3 deletions
libqpdf/QPDF.cc
@@ -2378,6 +2378,7 @@ QPDF::getCompressibleObjGens() @@ -2378,6 +2378,7 @@ QPDF::getCompressibleObjGens()
2378 2378
2379 const size_t max_obj = getObjectCount(); 2379 const size_t max_obj = getObjectCount();
2380 std::vector<bool> visited(max_obj, false); 2380 std::vector<bool> visited(max_obj, false);
  2381 + QPDFObjGen::set visited_gen; // for objects with generation > 0
2381 std::vector<QPDFObjectHandle> queue; 2382 std::vector<QPDFObjectHandle> queue;
2382 queue.reserve(512); 2383 queue.reserve(512);
2383 queue.push_back(m->trailer); 2384 queue.push_back(m->trailer);
@@ -2388,14 +2389,19 @@ QPDF::getCompressibleObjGens() @@ -2388,14 +2389,19 @@ QPDF::getCompressibleObjGens()
2388 if (obj.isIndirect()) { 2389 if (obj.isIndirect()) {
2389 QPDFObjGen og = obj.getObjGen(); 2390 QPDFObjGen og = obj.getObjGen();
2390 const size_t id = toS(og.getObj() - 1); 2391 const size_t id = toS(og.getObj() - 1);
  2392 + const int gen = og.getGen();
2391 if (id >= max_obj) 2393 if (id >= max_obj)
2392 - throw std::runtime_error( 2394 + throw std::logic_error(
2393 "unexpected object id encountered in getCompressibleObjGens"); 2395 "unexpected object id encountered in getCompressibleObjGens");
2394 - if (visited[id]) { 2396 + if ((gen == 0 && visited[id]) || visited_gen.count(og)) {
2395 QTC::TC("qpdf", "QPDF loop detected traversing objects"); 2397 QTC::TC("qpdf", "QPDF loop detected traversing objects");
2396 continue; 2398 continue;
2397 } 2399 }
2398 - visited[id] = true; 2400 + if (gen == 0) {
  2401 + visited[id] = true;
  2402 + } else {
  2403 + visited_gen.insert(og);
  2404 + }
2399 if (og == encryption_dict_og) { 2405 if (og == encryption_dict_og) {
2400 QTC::TC("qpdf", "QPDF exclude encryption dictionary"); 2406 QTC::TC("qpdf", "QPDF exclude encryption dictionary");
2401 } else if (!(obj.isStream() || 2407 } else if (!(obj.isStream() ||