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,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& empty, bool content_stream) | @@ -414,7 +417,7 @@ QPDFParser::parse(bool& 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 | }; |