Commit 218900d2c3d155ee139338414f7a57921636de38

Authored by Jay Berkenbilt
1 parent 028f106b

flatten scalar references for unreferenced objects

git-svn-id: svn+q:///qpdf/trunk@946 71b93d88-0707-0410-a8cf-f5a4172ac649
libqpdf/QPDF_optimization.cc
... ... @@ -69,18 +69,25 @@ QPDF::flattenScalarReferences()
69 69 queue.push_back(this->trailer);
70 70 std::set<ObjGen> visited;
71 71  
  72 + // Add every object in the xref table to the queue. This ensures
  73 + // that we flatten scalar references in unreferenced objects.
  74 + // This becomes important if we are preserving object streams in a
  75 + // file that has unreferenced objects in its object streams. (See
  76 + // QPDF bug 2974522 at SourceForge.)
  77 + for (std::map<ObjGen, QPDFXRefEntry>::iterator iter =
  78 + this->xref_table.begin();
  79 + iter != this->xref_table.end(); ++iter)
  80 + {
  81 + ObjGen const& og = (*iter).first;
  82 + queue.push_back(getObjectByID(og.obj, og.gen));
  83 + }
  84 +
72 85 while (! queue.empty())
73 86 {
74 87 QPDFObjectHandle node = queue.front();
75 88 queue.pop_front();
76 89 if (node.isIndirect())
77 90 {
78   - if (node.isScalar())
79   - {
80   - throw std::logic_error(
81   - "INTERNAL ERROR:"
82   - " flattenScalarReferences landed at indirect scalar");
83   - }
84 91 ObjGen og(node.getObjectID(), node.getGeneration());
85 92 if (visited.count(og) > 0)
86 93 {
... ...
qpdf/qtest/qpdf.test
... ... @@ -77,7 +77,7 @@ flush_tiff_cache();
77 77 show_ntests();
78 78 # ----------
79 79 $td->notify("--- Miscellaneous Tests ---");
80   -$n_tests += 16;
  80 +$n_tests += 18;
81 81  
82 82 $td->runtest("qpdf version",
83 83 {$td->COMMAND => "qpdf --version"},
... ... @@ -121,6 +121,19 @@ $td-&gt;runtest(&quot;show new xref stream&quot;,
121 121 $td->EXIT_STATUS => 0},
122 122 $td->NORMALIZE_NEWLINES);
123 123  
  124 +# Handle file with object stream containing an unreferenced object
  125 +# that in turn contains an indirect scalar (bug 2974522).
  126 +$td->runtest("unreferenced indirect scalar",
  127 + {$td->COMMAND =>
  128 + "qpdf --qdf --static-id --object-streams=preserve" .
  129 + " unreferenced-indirect-scalar.pdf a.qdf"},
  130 + {$td->STRING => "",
  131 + $td->EXIT_STATUS => 0},
  132 + $td->NORMALIZE_NEWLINES);
  133 +$td->runtest("check output",
  134 + {$td->FILE => "a.qdf"},
  135 + {$td->FILE => "unreferenced-indirect-scalar.out"});
  136 +
124 137 # Min/Force version
125 138 $td->runtest("set min version",
126 139 {$td->COMMAND => "qpdf --min-version=1.6 good1.pdf a.pdf"},
... ...
qpdf/qtest/qpdf/unreferenced-indirect-scalar.out 0 → 100644
No preview for this file type
qpdf/qtest/qpdf/unreferenced-indirect-scalar.pdf 0 → 100644
No preview for this file type