From 218900d2c3d155ee139338414f7a57921636de38 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 27 Mar 2010 15:42:17 +0000 Subject: [PATCH] flatten scalar references for unreferenced objects git-svn-id: svn+q:///qpdf/trunk@946 71b93d88-0707-0410-a8cf-f5a4172ac649 --- libqpdf/QPDF_optimization.cc | 19 ++++++++++++------ qpdf/qtest/qpdf.test | 15 +++++++++++++- .../qpdf/unreferenced-indirect-scalar.out | Bin 0 -> 1402 bytes .../qpdf/unreferenced-indirect-scalar.pdf | Bin 0 -> 1216 bytes 4 files changed, 27 insertions(+), 7 deletions(-) create mode 100644 qpdf/qtest/qpdf/unreferenced-indirect-scalar.out create mode 100644 qpdf/qtest/qpdf/unreferenced-indirect-scalar.pdf diff --git a/libqpdf/QPDF_optimization.cc b/libqpdf/QPDF_optimization.cc index e8d20fd5..872da859 100644 --- a/libqpdf/QPDF_optimization.cc +++ b/libqpdf/QPDF_optimization.cc @@ -69,18 +69,25 @@ QPDF::flattenScalarReferences() queue.push_back(this->trailer); std::set visited; + // Add every object in the xref table to the queue. This ensures + // that we flatten scalar references in unreferenced objects. + // This becomes important if we are preserving object streams in a + // file that has unreferenced objects in its object streams. (See + // QPDF bug 2974522 at SourceForge.) + for (std::map::iterator iter = + this->xref_table.begin(); + iter != this->xref_table.end(); ++iter) + { + ObjGen const& og = (*iter).first; + queue.push_back(getObjectByID(og.obj, og.gen)); + } + while (! queue.empty()) { QPDFObjectHandle node = queue.front(); queue.pop_front(); if (node.isIndirect()) { - if (node.isScalar()) - { - throw std::logic_error( - "INTERNAL ERROR:" - " flattenScalarReferences landed at indirect scalar"); - } ObjGen og(node.getObjectID(), node.getGeneration()); if (visited.count(og) > 0) { diff --git a/qpdf/qtest/qpdf.test b/qpdf/qtest/qpdf.test index 6d75a862..535d19d6 100644 --- a/qpdf/qtest/qpdf.test +++ b/qpdf/qtest/qpdf.test @@ -77,7 +77,7 @@ flush_tiff_cache(); show_ntests(); # ---------- $td->notify("--- Miscellaneous Tests ---"); -$n_tests += 16; +$n_tests += 18; $td->runtest("qpdf version", {$td->COMMAND => "qpdf --version"}, @@ -121,6 +121,19 @@ $td->runtest("show new xref stream", $td->EXIT_STATUS => 0}, $td->NORMALIZE_NEWLINES); +# Handle file with object stream containing an unreferenced object +# that in turn contains an indirect scalar (bug 2974522). +$td->runtest("unreferenced indirect scalar", + {$td->COMMAND => + "qpdf --qdf --static-id --object-streams=preserve" . + " unreferenced-indirect-scalar.pdf a.qdf"}, + {$td->STRING => "", + $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); +$td->runtest("check output", + {$td->FILE => "a.qdf"}, + {$td->FILE => "unreferenced-indirect-scalar.out"}); + # Min/Force version $td->runtest("set min version", {$td->COMMAND => "qpdf --min-version=1.6 good1.pdf a.pdf"}, diff --git a/qpdf/qtest/qpdf/unreferenced-indirect-scalar.out b/qpdf/qtest/qpdf/unreferenced-indirect-scalar.out new file mode 100644 index 0000000000000000000000000000000000000000..c1bf4a9d1563afc623e61e6911b148d8e8563438 GIT binary patch literal 1402 zcmaJ>O>fgc5KWm=7KkkVGs1pZhF?AdHv<$zv9Q zOeBjTk^yrZKy0-%(7v}v)Rg+Kp{xqE2Jao{x?Gi2cH8eAAMSzQ>6>LM)qp_F^Nrkt z%w)HEMRFb`5Iq4OCJ-ILfqtkAa035W77bkB3LxkRFE^xC$yUmsr}T#@Z951C>Dule z=*p1T2&xCrvA zILlR>C&_X$7Chi#;>%EkaS|oM7jYnc83+*zKT5*MC0V8G>j-~4qZgwmc*WSkc!Kd1 kV;AEY#`B%sUCgdAevSr;Z%kI3b&Z8_js-c+(dm@^1B(oC_5c6? literal 0 HcmV?d00001 diff --git a/qpdf/qtest/qpdf/unreferenced-indirect-scalar.pdf b/qpdf/qtest/qpdf/unreferenced-indirect-scalar.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e1be6311256e732a60d3fc7ffc9058f05f399a47 GIT binary patch literal 1216 zcmaJ=&2G~`5Kda)uy4R^E|EY2{I_1)D2hbdMxa6)5=%u?J*@3baMgM%dy4{(!wc{T z9C#>hh?%ubE@`5ScV~aT@0*>O(foM!(t8!M(XT&0{<6_W>$;42;DXMs*?7zVob=nB z0_QxtUYc9-->YhEzCh$gg^&aWUsLC{u^pZcQqLfp;=?Gm* z+kS=TTQ5pzv=ZjB#_QXF7pl?sb&hXf@lpH?8G46Y55kTL03U>ca^|(pm&$p5xo-5C|eHJE)A*L7ZATzXs^Zg5%!#q`}2Z1pP8zPu9$H~ z9YI9@)4I|%+_ed(4AXv__^v}d*RpLpVw#d<%#zO`UEw_P@$W)f;QZNK8)@`&NUzyR zx`W!n5eetCYvp*mTJ_UH5qRIIJSOJ?E&++rY;7&H#t!RB!daHzv23aEoOj1?IZk3< zxq-?G6&AvmA`iTPXRBCdD$bH5pNzB6UwK^dEK5|92U57w