Commit 83910224167a7087e219d3ab2613826b692d75d4
Committed by
Jay Berkenbilt
1 parent
9da50ca3
Avoid inserting direct null objects into olist
Showing
3 changed files
with
19 additions
and
9 deletions
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& 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 | }; | ... | ... |