From c9a9fe9c2f8837bdfdd2b0e58fce9a82b0a64881 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Thu, 26 Dec 2013 11:51:50 -0500 Subject: [PATCH] Avoid traversing same object twice when copying objects This is a performance fix. The output is unchanged. Fixes #28. --- ChangeLog | 8 ++++++++ libqpdf/QPDF.cc | 5 +++++ qpdf/qpdf.testcov | 1 + 3 files changed, 14 insertions(+) diff --git a/ChangeLog b/ChangeLog index 9835d203..622495b4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2013-12-26 Jay Berkenbilt + + * Bug fix: when copying foreign objects (which occurs during page + splitting among other cases), avoid traversing the same object + more than once if it appears more than once in the same direct + object. This bug is performance-only and does not affect the + actual output. + 2013-12-17 Jay Berkenbilt * 5.1.0: release diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 543b34b7..51f39abd 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -1755,6 +1755,11 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, QTC::TC("qpdf", "QPDF loop reserving objects"); return; } + if (obj_copier.object_map.find(foreign_og) != obj_copier.object_map.end()) + { + QTC::TC("qpdf", "QPDF already reserved object"); + return; + } QTC::TC("qpdf", "QPDF copy indirect"); obj_copier.visiting.insert(foreign_og); std::map::iterator mapping = diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov index e78a4f4a..b1dc2c0a 100644 --- a/qpdf/qpdf.testcov +++ b/qpdf/qpdf.testcov @@ -268,3 +268,4 @@ QPDF xref space 2 qpdf pages range omitted at end 0 qpdf pages range omitted in middle 0 qpdf npages 0 +QPDF already reserved object 0