aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2010-03-27 16:42:17 +0100
committerJay Berkenbilt <ejb@ql.org>2010-03-27 16:42:17 +0100
commit218900d2c3d155ee139338414f7a57921636de38 (patch)
tree1166267136cfb3a9be33d6fc50ac5b74e35ac6f7
parent028f106bee8602632435c78c1749370fbdd13780 (diff)
downloadqpdf-218900d2c3d155ee139338414f7a57921636de38.tar.zst
flatten scalar references for unreferenced objects
git-svn-id: svn+q:///qpdf/trunk@946 71b93d88-0707-0410-a8cf-f5a4172ac649
-rw-r--r--libqpdf/QPDF_optimization.cc19
-rw-r--r--qpdf/qtest/qpdf.test15
-rw-r--r--qpdf/qtest/qpdf/unreferenced-indirect-scalar.outbin0 -> 1402 bytes
-rw-r--r--qpdf/qtest/qpdf/unreferenced-indirect-scalar.pdfbin0 -> 1216 bytes
4 files changed, 27 insertions, 7 deletions
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<ObjGen> 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<ObjGen, QPDFXRefEntry>::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 00000000..c1bf4a9d
--- /dev/null
+++ b/qpdf/qtest/qpdf/unreferenced-indirect-scalar.out
Binary files differ
diff --git a/qpdf/qtest/qpdf/unreferenced-indirect-scalar.pdf b/qpdf/qtest/qpdf/unreferenced-indirect-scalar.pdf
new file mode 100644
index 00000000..e1be6311
--- /dev/null
+++ b/qpdf/qtest/qpdf/unreferenced-indirect-scalar.pdf
Binary files differ