Commit 83910224167a7087e219d3ab2613826b692d75d4

Authored by m-holger
Committed by Jay Berkenbilt
1 parent 9da50ca3

Avoid inserting direct null objects into olist

libqpdf/QPDFParser.cc
... ... @@ -308,7 +308,7 @@ QPDFParser::parse(bool& empty, bool content_stream)
308 308 setDescription(object, input->getLastOffset());
309 309 }
310 310 set_offset = true;
311   - olist.push_back(is_null ? null_oh : object);
  311 + olist.push_back(object);
312 312 break;
313 313  
314 314 case st_top:
... ... @@ -339,16 +339,19 @@ QPDFParser::parse(bool& empty, bool content_stream)
339 339 // Convert list to map. Alternating elements are keys. Attempt
340 340 // to recover more or less gracefully from invalid dictionaries.
341 341 std::set<std::string> names;
342   - size_t n_elements = olist.size();
343   - for (size_t i = 0; i < n_elements; ++i) {
344   - QPDFObjectHandle oh = olist.at(i);
345   - if ((!oh.isIndirect()) && oh.isName()) {
346   - names.insert(oh.getName());
  342 + for (auto& obj: olist) {
  343 + if (obj) {
  344 + if (obj->getTypeCode() == ::ot_name) {
  345 + names.insert(obj->getStringValue());
  346 + }
  347 + } else {
  348 + obj = null_oh;
347 349 }
348 350 }
349 351  
350 352 std::map<std::string, QPDFObjectHandle> dict;
351 353 int next_fake_key = 1;
  354 + size_t n_elements = olist.size();
352 355 for (unsigned int i = 0; i < n_elements; ++i) {
353 356 QPDFObjectHandle key_obj = olist.at(i);
354 357 QPDFObjectHandle val;
... ... @@ -414,7 +417,7 @@ QPDFParser::parse(bool&amp; empty, bool content_stream)
414 417 if (state_stack.back() == st_top) {
415 418 done = true;
416 419 } else {
417   - stack.back().olist.push_back(is_null ? null_oh : object);
  420 + stack.back().olist.push_back(object);
418 421 }
419 422 }
420 423 }
... ...
libqpdf/QPDF_Array.cc
... ... @@ -123,8 +123,12 @@ void
123 123 QPDF_Array::setFromVector(std::vector<std::shared_ptr<QPDFObject>>&& v)
124 124 {
125 125 this->elements = SparseOHArray();
126   - for (auto&& iter: v) {
127   - this->elements.append(iter);
  126 + for (auto&& item: v) {
  127 + if (item) {
  128 + this->elements.append(item);
  129 + } else {
  130 + ++this->elements.n_elements;
  131 + }
128 132 }
129 133 }
130 134  
... ...
libqpdf/qpdf/SparseOHArray.hh
... ... @@ -4,6 +4,8 @@
4 4 #include <qpdf/QPDFObjectHandle.hh>
5 5 #include <unordered_map>
6 6  
  7 +class QPDF_Array;
  8 +
7 9 class SparseOHArray
8 10 {
9 11 public:
... ... @@ -25,6 +27,7 @@ class SparseOHArray
25 27 const_iterator end() const;
26 28  
27 29 private:
  30 + friend class QPDF_Array;
28 31 std::unordered_map<size_t, QPDFObjectHandle> elements;
29 32 size_t n_elements;
30 33 };
... ...