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,7 +308,7 @@ QPDFParser::parse(bool& empty, bool content_stream)
308 setDescription(object, input->getLastOffset()); 308 setDescription(object, input->getLastOffset());
309 } 309 }
310 set_offset = true; 310 set_offset = true;
311 - olist.push_back(is_null ? null_oh : object); 311 + olist.push_back(object);
312 break; 312 break;
313 313
314 case st_top: 314 case st_top:
@@ -339,16 +339,19 @@ QPDFParser::parse(bool& empty, bool content_stream) @@ -339,16 +339,19 @@ QPDFParser::parse(bool& empty, bool content_stream)
339 // Convert list to map. Alternating elements are keys. Attempt 339 // Convert list to map. Alternating elements are keys. Attempt
340 // to recover more or less gracefully from invalid dictionaries. 340 // to recover more or less gracefully from invalid dictionaries.
341 std::set<std::string> names; 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 std::map<std::string, QPDFObjectHandle> dict; 352 std::map<std::string, QPDFObjectHandle> dict;
351 int next_fake_key = 1; 353 int next_fake_key = 1;
  354 + size_t n_elements = olist.size();
352 for (unsigned int i = 0; i < n_elements; ++i) { 355 for (unsigned int i = 0; i < n_elements; ++i) {
353 QPDFObjectHandle key_obj = olist.at(i); 356 QPDFObjectHandle key_obj = olist.at(i);
354 QPDFObjectHandle val; 357 QPDFObjectHandle val;
@@ -414,7 +417,7 @@ QPDFParser::parse(bool&amp; empty, bool content_stream) @@ -414,7 +417,7 @@ QPDFParser::parse(bool&amp; empty, bool content_stream)
414 if (state_stack.back() == st_top) { 417 if (state_stack.back() == st_top) {
415 done = true; 418 done = true;
416 } else { 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,8 +123,12 @@ void
123 QPDF_Array::setFromVector(std::vector<std::shared_ptr<QPDFObject>>&& v) 123 QPDF_Array::setFromVector(std::vector<std::shared_ptr<QPDFObject>>&& v)
124 { 124 {
125 this->elements = SparseOHArray(); 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,6 +4,8 @@
4 #include <qpdf/QPDFObjectHandle.hh> 4 #include <qpdf/QPDFObjectHandle.hh>
5 #include <unordered_map> 5 #include <unordered_map>
6 6
  7 +class QPDF_Array;
  8 +
7 class SparseOHArray 9 class SparseOHArray
8 { 10 {
9 public: 11 public:
@@ -25,6 +27,7 @@ class SparseOHArray @@ -25,6 +27,7 @@ class SparseOHArray
25 const_iterator end() const; 27 const_iterator end() const;
26 28
27 private: 29 private:
  30 + friend class QPDF_Array;
28 std::unordered_map<size_t, QPDFObjectHandle> elements; 31 std::unordered_map<size_t, QPDFObjectHandle> elements;
29 size_t n_elements; 32 size_t n_elements;
30 }; 33 };