Commit 27e1433365431cf81ee962a43fb171fc35f7130e
1 parent
2774ac30
Rename `objects_*` limits to `parser_*` for clarity and consistency. Update rela…
…ted tests, documentation, and references across the codebase.
Showing
7 changed files
with
87 additions
and
87 deletions
include/qpdf/Constants.h
| ... | ... | @@ -281,10 +281,10 @@ enum qpdf_param_e { |
| 281 | 281 | /* global limits */ |
| 282 | 282 | |
| 283 | 283 | /* object - parser limits */ |
| 284 | - qpdf_p_objects_max_nesting = 0x12000, | |
| 285 | - qpdf_p_objects_max_errors, | |
| 286 | - qpdf_p_objects_max_container_size, | |
| 287 | - qpdf_p_objects_max_container_size_damaged, | |
| 284 | + qpdf_p_parser_max_nesting = 0x13000, | |
| 285 | + qpdf_p_parser_max_errors, | |
| 286 | + qpdf_p_parser_max_container_size, | |
| 287 | + qpdf_p_parser_max_container_size_damaged, | |
| 288 | 288 | |
| 289 | 289 | /* next section = 0x20000 */ |
| 290 | 290 | qpdf_enum_max = 0x7fffffff, | ... | ... |
include/qpdf/global.hh
| ... | ... | @@ -104,9 +104,9 @@ namespace qpdf::global |
| 104 | 104 | /// @note The maximum nesting level cannot be disabled by calling `default_limit(false)`. |
| 105 | 105 | /// |
| 106 | 106 | /// @since 12.3 |
| 107 | - uint32_t inline objects_max_nesting() | |
| 107 | + uint32_t inline parser_max_nesting() | |
| 108 | 108 | { |
| 109 | - return get_uint32(qpdf_p_objects_max_nesting); | |
| 109 | + return get_uint32(qpdf_p_parser_max_nesting); | |
| 110 | 110 | } |
| 111 | 111 | |
| 112 | 112 | /// @brief Sets the maximum nesting level while parsing objects. |
| ... | ... | @@ -116,9 +116,9 @@ namespace qpdf::global |
| 116 | 116 | /// @note The maximum nesting level cannot be disabled by calling `default_limit(false)`. |
| 117 | 117 | /// |
| 118 | 118 | /// @since 12.3 |
| 119 | - void inline objects_max_nesting(uint32_t value) | |
| 119 | + void inline parser_max_nesting(uint32_t value) | |
| 120 | 120 | { |
| 121 | - set_uint32(qpdf_p_objects_max_nesting, value); | |
| 121 | + set_uint32(qpdf_p_parser_max_nesting, value); | |
| 122 | 122 | } |
| 123 | 123 | |
| 124 | 124 | /// @brief Retrieves the maximum number of errors allowed while parsing objects. |
| ... | ... | @@ -128,9 +128,9 @@ namespace qpdf::global |
| 128 | 128 | /// @return The maximum number of errors allowed while parsing objects. |
| 129 | 129 | /// |
| 130 | 130 | /// @since 12.3 |
| 131 | - uint32_t inline objects_max_errors() | |
| 131 | + uint32_t inline parser_max_errors() | |
| 132 | 132 | { |
| 133 | - return get_uint32(qpdf_p_objects_max_errors); | |
| 133 | + return get_uint32(qpdf_p_parser_max_errors); | |
| 134 | 134 | } |
| 135 | 135 | |
| 136 | 136 | /// Sets the maximum number of errors allowed while parsing objects. |
| ... | ... | @@ -140,9 +140,9 @@ namespace qpdf::global |
| 140 | 140 | /// @param value The maximum number of errors allowed while parsing objects to set. |
| 141 | 141 | /// |
| 142 | 142 | /// @since 12.3 |
| 143 | - void inline objects_max_errors(uint32_t value) | |
| 143 | + void inline parser_max_errors(uint32_t value) | |
| 144 | 144 | { |
| 145 | - set_uint32(qpdf_p_objects_max_errors, value); | |
| 145 | + set_uint32(qpdf_p_parser_max_errors, value); | |
| 146 | 146 | } |
| 147 | 147 | |
| 148 | 148 | /// @brief Retrieves the maximum number of objectstop-level allowed in a container while |
| ... | ... | @@ -155,9 +155,9 @@ namespace qpdf::global |
| 155 | 155 | /// objects. |
| 156 | 156 | /// |
| 157 | 157 | /// @since 12.3 |
| 158 | - uint32_t inline objects_max_container_size() | |
| 158 | + uint32_t inline parser_max_container_size() | |
| 159 | 159 | { |
| 160 | - return get_uint32(qpdf_p_objects_max_container_size); | |
| 160 | + return get_uint32(qpdf_p_parser_max_container_size); | |
| 161 | 161 | } |
| 162 | 162 | |
| 163 | 163 | /// @brief Sets the maximum number oftop-level objects allowed in a container while parsing. |
| ... | ... | @@ -169,9 +169,9 @@ namespace qpdf::global |
| 169 | 169 | /// parsing objects to set. |
| 170 | 170 | /// |
| 171 | 171 | /// @since 12.3 |
| 172 | - void inline objects_max_container_size(uint32_t value) | |
| 172 | + void inline parser_max_container_size(uint32_t value) | |
| 173 | 173 | { |
| 174 | - set_uint32(qpdf_p_objects_max_container_size, value); | |
| 174 | + set_uint32(qpdf_p_parser_max_container_size, value); | |
| 175 | 175 | } |
| 176 | 176 | |
| 177 | 177 | /// @brief Retrieves the maximum number of top-level objects allowed in a container while |
| ... | ... | @@ -185,9 +185,9 @@ namespace qpdf::global |
| 185 | 185 | /// objects. |
| 186 | 186 | /// |
| 187 | 187 | /// @since 12.3 |
| 188 | - uint32_t inline objects_max_container_size_damaged() | |
| 188 | + uint32_t inline parser_max_container_size_damaged() | |
| 189 | 189 | { |
| 190 | - return get_uint32(qpdf_p_objects_max_container_size_damaged); | |
| 190 | + return get_uint32(qpdf_p_parser_max_container_size_damaged); | |
| 191 | 191 | } |
| 192 | 192 | |
| 193 | 193 | /// @brief Sets the maximum number of top-level objects allowed in a container while |
| ... | ... | @@ -201,9 +201,9 @@ namespace qpdf::global |
| 201 | 201 | /// parsing objects to set. |
| 202 | 202 | /// |
| 203 | 203 | /// @since 12.3 |
| 204 | - void inline objects_max_container_size_damaged(uint32_t value) | |
| 204 | + void inline parser_max_container_size_damaged(uint32_t value) | |
| 205 | 205 | { |
| 206 | - set_uint32(qpdf_p_objects_max_container_size_damaged, value); | |
| 206 | + set_uint32(qpdf_p_parser_max_container_size_damaged, value); | |
| 207 | 207 | } |
| 208 | 208 | } // namespace limits |
| 209 | 209 | ... | ... |
libqpdf/QPDFParser.cc
| ... | ... | @@ -15,7 +15,7 @@ using namespace qpdf; |
| 15 | 15 | |
| 16 | 16 | using ObjectPtr = std::shared_ptr<QPDFObject>; |
| 17 | 17 | |
| 18 | -static uint32_t const& max_nesting{global::Limits::objects_max_nesting()}; | |
| 18 | +static uint32_t const& max_nesting{global::Limits::parser_max_nesting()}; | |
| 19 | 19 | |
| 20 | 20 | // The ParseGuard class allows QPDFParser to detect re-entrant parsing. It also provides |
| 21 | 21 | // special access to allow the parser to create unresolved objects and dangling references. |
| ... | ... | @@ -587,7 +587,7 @@ template <typename T, typename... Args> |
| 587 | 587 | void |
| 588 | 588 | QPDFParser::addScalar(Args&&... args) |
| 589 | 589 | { |
| 590 | - auto limit = Limits::objects_max_container_size(bad_count || sanity_checks); | |
| 590 | + auto limit = Limits::parser_max_container_size(bad_count || sanity_checks); | |
| 591 | 591 | if (frame->olist.size() > limit || frame->dict.size() > limit) { |
| 592 | 592 | // Stop adding scalars. We are going to abort when the close token or a bad token is |
| 593 | 593 | // encountered. |
| ... | ... | @@ -645,7 +645,7 @@ QPDFParser::fixMissingKeys() |
| 645 | 645 | void |
| 646 | 646 | QPDFParser::check_too_many_bad_tokens() |
| 647 | 647 | { |
| 648 | - auto limit = Limits::objects_max_container_size(bad_count || sanity_checks); | |
| 648 | + auto limit = Limits::parser_max_container_size(bad_count || sanity_checks); | |
| 649 | 649 | if (frame->olist.size() > limit || frame->dict.size() > limit) { |
| 650 | 650 | if (bad_count) { |
| 651 | 651 | Limits::error(); | ... | ... |
libqpdf/global.cc
| ... | ... | @@ -9,24 +9,24 @@ Limits Limits::l; |
| 9 | 9 | Options Options::o; |
| 10 | 10 | |
| 11 | 11 | void |
| 12 | -Limits::objects_max_container_size(bool damaged, uint32_t value) | |
| 12 | +Limits::parser_max_container_size(bool damaged, uint32_t value) | |
| 13 | 13 | { |
| 14 | 14 | if (damaged) { |
| 15 | - l.objects_max_container_size_damaged_set_ = true; | |
| 16 | - l.objects_max_container_size_damaged_ = value; | |
| 15 | + l.parser_max_container_size_damaged_set_ = true; | |
| 16 | + l.parser_max_container_size_damaged_ = value; | |
| 17 | 17 | } else { |
| 18 | - l.objects_max_container_size_ = value; | |
| 18 | + l.parser_max_container_size_ = value; | |
| 19 | 19 | } |
| 20 | 20 | } |
| 21 | 21 | |
| 22 | 22 | void |
| 23 | 23 | Limits::disable_defaults() |
| 24 | 24 | { |
| 25 | - if (!l.objects_max_errors_set_) { | |
| 26 | - l.objects_max_errors_ = 0; | |
| 25 | + if (!l.parser_max_errors_set_) { | |
| 26 | + l.parser_max_errors_ = 0; | |
| 27 | 27 | } |
| 28 | - if (!l.objects_max_container_size_damaged_set_) { | |
| 29 | - l.objects_max_container_size_damaged_ = std::numeric_limits<uint32_t>::max(); | |
| 28 | + if (!l.parser_max_container_size_damaged_set_) { | |
| 29 | + l.parser_max_container_size_damaged_ = std::numeric_limits<uint32_t>::max(); | |
| 30 | 30 | } |
| 31 | 31 | } |
| 32 | 32 | |
| ... | ... | @@ -41,17 +41,17 @@ qpdf_global_get_uint32(qpdf_param_e param, uint32_t* value) |
| 41 | 41 | case qpdf_p_limit_errors: |
| 42 | 42 | *value = Limits::errors(); |
| 43 | 43 | return qpdf_r_ok; |
| 44 | - case qpdf_p_objects_max_nesting: | |
| 45 | - *value = Limits::objects_max_nesting(); | |
| 44 | + case qpdf_p_parser_max_nesting: | |
| 45 | + *value = Limits::parser_max_nesting(); | |
| 46 | 46 | return qpdf_r_ok; |
| 47 | - case qpdf_p_objects_max_errors: | |
| 48 | - *value = Limits::objects_max_errors(); | |
| 47 | + case qpdf_p_parser_max_errors: | |
| 48 | + *value = Limits::parser_max_errors(); | |
| 49 | 49 | return qpdf_r_ok; |
| 50 | - case qpdf_p_objects_max_container_size: | |
| 51 | - *value = Limits::objects_max_container_size(false); | |
| 50 | + case qpdf_p_parser_max_container_size: | |
| 51 | + *value = Limits::parser_max_container_size(false); | |
| 52 | 52 | return qpdf_r_ok; |
| 53 | - case qpdf_p_objects_max_container_size_damaged: | |
| 54 | - *value = Limits::objects_max_container_size(true); | |
| 53 | + case qpdf_p_parser_max_container_size_damaged: | |
| 54 | + *value = Limits::parser_max_container_size(true); | |
| 55 | 55 | return qpdf_r_ok; |
| 56 | 56 | default: |
| 57 | 57 | return qpdf_r_bad_parameter; |
| ... | ... | @@ -65,17 +65,17 @@ qpdf_global_set_uint32(qpdf_param_e param, uint32_t value) |
| 65 | 65 | case qpdf_p_default_limits: |
| 66 | 66 | Options::default_limits(value); |
| 67 | 67 | return qpdf_r_ok; |
| 68 | - case qpdf_p_objects_max_nesting: | |
| 69 | - Limits::objects_max_nesting(value); | |
| 68 | + case qpdf_p_parser_max_nesting: | |
| 69 | + Limits::parser_max_nesting(value); | |
| 70 | 70 | return qpdf_r_ok; |
| 71 | - case qpdf_p_objects_max_errors: | |
| 72 | - Limits::objects_max_errors(value); | |
| 71 | + case qpdf_p_parser_max_errors: | |
| 72 | + Limits::parser_max_errors(value); | |
| 73 | 73 | return qpdf_r_ok; |
| 74 | - case qpdf_p_objects_max_container_size: | |
| 75 | - Limits::objects_max_container_size(false, value); | |
| 74 | + case qpdf_p_parser_max_container_size: | |
| 75 | + Limits::parser_max_container_size(false, value); | |
| 76 | 76 | return qpdf_r_ok; |
| 77 | - case qpdf_p_objects_max_container_size_damaged: | |
| 78 | - Limits::objects_max_container_size(true, value); | |
| 77 | + case qpdf_p_parser_max_container_size_damaged: | |
| 78 | + Limits::parser_max_container_size(true, value); | |
| 79 | 79 | return qpdf_r_ok; |
| 80 | 80 | default: |
| 81 | 81 | return qpdf_r_bad_parameter; | ... | ... |
libqpdf/qpdf/QPDFParser.hh
| ... | ... | @@ -149,7 +149,7 @@ class QPDFParser |
| 149 | 149 | // it only gets incremented or reset when a bad token is encountered. |
| 150 | 150 | int bad_count{0}; |
| 151 | 151 | // Number of bad tokens (remaining) before giving up. |
| 152 | - uint32_t max_bad_count{Limits::objects_max_errors()}; | |
| 152 | + uint32_t max_bad_count{Limits::parser_max_errors()}; | |
| 153 | 153 | // Number of good tokens since last bad token. Irrelevant if bad_count == 0. |
| 154 | 154 | int good_count{0}; |
| 155 | 155 | // Start offset including any leading whitespace. | ... | ... |
libqpdf/qpdf/global_private.hh
| ... | ... | @@ -16,37 +16,37 @@ namespace qpdf::global |
| 16 | 16 | Limits& operator=(Limits&&) = delete; |
| 17 | 17 | |
| 18 | 18 | static uint32_t const& |
| 19 | - objects_max_nesting() | |
| 19 | + parser_max_nesting() | |
| 20 | 20 | { |
| 21 | - return l.objects_max_nesting_; | |
| 21 | + return l.parser_max_nesting_; | |
| 22 | 22 | } |
| 23 | 23 | |
| 24 | 24 | static void |
| 25 | - objects_max_nesting(uint32_t value) | |
| 25 | + parser_max_nesting(uint32_t value) | |
| 26 | 26 | { |
| 27 | - l.objects_max_nesting_ = value; | |
| 27 | + l.parser_max_nesting_ = value; | |
| 28 | 28 | } |
| 29 | 29 | |
| 30 | 30 | static uint32_t const& |
| 31 | - objects_max_errors() | |
| 31 | + parser_max_errors() | |
| 32 | 32 | { |
| 33 | - return l.objects_max_errors_; | |
| 33 | + return l.parser_max_errors_; | |
| 34 | 34 | } |
| 35 | 35 | |
| 36 | 36 | static void |
| 37 | - objects_max_errors(uint32_t value) | |
| 37 | + parser_max_errors(uint32_t value) | |
| 38 | 38 | { |
| 39 | - l.objects_max_errors_set_ = true; | |
| 40 | - l.objects_max_errors_ = value; | |
| 39 | + l.parser_max_errors_set_ = true; | |
| 40 | + l.parser_max_errors_ = value; | |
| 41 | 41 | } |
| 42 | 42 | |
| 43 | 43 | static uint32_t const& |
| 44 | - objects_max_container_size(bool damaged) | |
| 44 | + parser_max_container_size(bool damaged) | |
| 45 | 45 | { |
| 46 | - return damaged ? l.objects_max_container_size_damaged_ : l.objects_max_container_size_; | |
| 46 | + return damaged ? l.parser_max_container_size_damaged_ : l.parser_max_container_size_; | |
| 47 | 47 | } |
| 48 | 48 | |
| 49 | - static void objects_max_container_size(bool damaged, uint32_t value); | |
| 49 | + static void parser_max_container_size(bool damaged, uint32_t value); | |
| 50 | 50 | |
| 51 | 51 | /// Record a limit error. |
| 52 | 52 | static void |
| ... | ... | @@ -73,12 +73,12 @@ namespace qpdf::global |
| 73 | 73 | |
| 74 | 74 | uint32_t errors_{0}; |
| 75 | 75 | |
| 76 | - uint32_t objects_max_nesting_{499}; | |
| 77 | - uint32_t objects_max_errors_{15}; | |
| 78 | - bool objects_max_errors_set_{false}; | |
| 79 | - uint32_t objects_max_container_size_{std::numeric_limits<uint32_t>::max()}; | |
| 80 | - uint32_t objects_max_container_size_damaged_{5'000}; | |
| 81 | - bool objects_max_container_size_damaged_set_{false}; | |
| 76 | + uint32_t parser_max_nesting_{499}; | |
| 77 | + uint32_t parser_max_errors_{15}; | |
| 78 | + bool parser_max_errors_set_{false}; | |
| 79 | + uint32_t parser_max_container_size_{std::numeric_limits<uint32_t>::max()}; | |
| 80 | + uint32_t parser_max_container_size_damaged_{5'000}; | |
| 81 | + bool parser_max_container_size_damaged_set_{false}; | |
| 82 | 82 | }; |
| 83 | 83 | |
| 84 | 84 | class Options | ... | ... |
libtests/objects.cc
| ... | ... | @@ -162,18 +162,18 @@ test_2(QPDF& pdf, char const* arg2) |
| 162 | 162 | using namespace qpdf::global::limits; |
| 163 | 163 | |
| 164 | 164 | // Check default values |
| 165 | - assert(objects_max_nesting() == 499); | |
| 166 | - assert(objects_max_errors() == 15); | |
| 167 | - assert(objects_max_container_size() == std::numeric_limits<uint32_t>::max()); | |
| 168 | - assert(objects_max_container_size_damaged() == 5'000); | |
| 165 | + assert(parser_max_nesting() == 499); | |
| 166 | + assert(parser_max_errors() == 15); | |
| 167 | + assert(parser_max_container_size() == std::numeric_limits<uint32_t>::max()); | |
| 168 | + assert(parser_max_container_size_damaged() == 5'000); | |
| 169 | 169 | assert(default_limits()); |
| 170 | 170 | |
| 171 | 171 | // Test disabling optional default limits |
| 172 | 172 | default_limits(false); |
| 173 | - assert(objects_max_nesting() == 499); | |
| 174 | - assert(objects_max_errors() == 0); | |
| 175 | - assert(objects_max_container_size() == std::numeric_limits<uint32_t>::max()); | |
| 176 | - assert(objects_max_container_size_damaged() == std::numeric_limits<uint32_t>::max()); | |
| 173 | + assert(parser_max_nesting() == 499); | |
| 174 | + assert(parser_max_errors() == 0); | |
| 175 | + assert(parser_max_container_size() == std::numeric_limits<uint32_t>::max()); | |
| 176 | + assert(parser_max_container_size_damaged() == std::numeric_limits<uint32_t>::max()); | |
| 177 | 177 | assert(!default_limits()); |
| 178 | 178 | |
| 179 | 179 | // Check disabling default limits is irreversible |
| ... | ... | @@ -181,22 +181,22 @@ test_2(QPDF& pdf, char const* arg2) |
| 181 | 181 | assert(!default_limits()); |
| 182 | 182 | |
| 183 | 183 | // Test setting limits |
| 184 | - objects_max_nesting(11); | |
| 185 | - objects_max_errors(12); | |
| 186 | - objects_max_container_size(13); | |
| 187 | - objects_max_container_size_damaged(14); | |
| 184 | + parser_max_nesting(11); | |
| 185 | + parser_max_errors(12); | |
| 186 | + parser_max_container_size(13); | |
| 187 | + parser_max_container_size_damaged(14); | |
| 188 | 188 | |
| 189 | - assert(objects_max_nesting() == 11); | |
| 190 | - assert(objects_max_errors() == 12); | |
| 191 | - assert(objects_max_container_size() == 13); | |
| 192 | - assert(objects_max_container_size_damaged() == 14); | |
| 189 | + assert(parser_max_nesting() == 11); | |
| 190 | + assert(parser_max_errors() == 12); | |
| 191 | + assert(parser_max_container_size() == 13); | |
| 192 | + assert(parser_max_container_size_damaged() == 14); | |
| 193 | 193 | |
| 194 | 194 | // Check disabling default limits does not override explicit limits |
| 195 | 195 | default_limits(false); |
| 196 | - assert(objects_max_nesting() == 11); | |
| 197 | - assert(objects_max_errors() == 12); | |
| 198 | - assert(objects_max_container_size() == 13); | |
| 199 | - assert(objects_max_container_size_damaged() == 14); | |
| 196 | + assert(parser_max_nesting() == 11); | |
| 197 | + assert(parser_max_errors() == 12); | |
| 198 | + assert(parser_max_container_size() == 13); | |
| 199 | + assert(parser_max_container_size_damaged() == 14); | |
| 200 | 200 | |
| 201 | 201 | // Test parameter checking |
| 202 | 202 | QUtil::handle_result_code(qpdf_r_ok, ""); |
| ... | ... | @@ -226,7 +226,7 @@ test_2(QPDF& pdf, char const* arg2) |
| 226 | 226 | assert(qpdf::global::limit_errors() == 0); |
| 227 | 227 | QPDFObjectHandle::parse("[[[[]]]]"); |
| 228 | 228 | assert(qpdf::global::limit_errors() == 0); |
| 229 | - objects_max_nesting(3); | |
| 229 | + parser_max_nesting(3); | |
| 230 | 230 | try { |
| 231 | 231 | QPDFObjectHandle::parse("[[[[[]]]]]"); |
| 232 | 232 | } catch (std::exception&) { | ... | ... |