Commit 27e1433365431cf81ee962a43fb171fc35f7130e

Authored by m-holger
1 parent 2774ac30

Rename `objects_*` limits to `parser_*` for clarity and consistency. Update rela…

…ted tests, documentation, and references across the codebase.
include/qpdf/Constants.h
@@ -281,10 +281,10 @@ enum qpdf_param_e { @@ -281,10 +281,10 @@ enum qpdf_param_e {
281 /* global limits */ 281 /* global limits */
282 282
283 /* object - parser limits */ 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 /* next section = 0x20000 */ 289 /* next section = 0x20000 */
290 qpdf_enum_max = 0x7fffffff, 290 qpdf_enum_max = 0x7fffffff,
include/qpdf/global.hh
@@ -104,9 +104,9 @@ namespace qpdf::global @@ -104,9 +104,9 @@ namespace qpdf::global
104 /// @note The maximum nesting level cannot be disabled by calling `default_limit(false)`. 104 /// @note The maximum nesting level cannot be disabled by calling `default_limit(false)`.
105 /// 105 ///
106 /// @since 12.3 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 /// @brief Sets the maximum nesting level while parsing objects. 112 /// @brief Sets the maximum nesting level while parsing objects.
@@ -116,9 +116,9 @@ namespace qpdf::global @@ -116,9 +116,9 @@ namespace qpdf::global
116 /// @note The maximum nesting level cannot be disabled by calling `default_limit(false)`. 116 /// @note The maximum nesting level cannot be disabled by calling `default_limit(false)`.
117 /// 117 ///
118 /// @since 12.3 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 /// @brief Retrieves the maximum number of errors allowed while parsing objects. 124 /// @brief Retrieves the maximum number of errors allowed while parsing objects.
@@ -128,9 +128,9 @@ namespace qpdf::global @@ -128,9 +128,9 @@ namespace qpdf::global
128 /// @return The maximum number of errors allowed while parsing objects. 128 /// @return The maximum number of errors allowed while parsing objects.
129 /// 129 ///
130 /// @since 12.3 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 /// Sets the maximum number of errors allowed while parsing objects. 136 /// Sets the maximum number of errors allowed while parsing objects.
@@ -140,9 +140,9 @@ namespace qpdf::global @@ -140,9 +140,9 @@ namespace qpdf::global
140 /// @param value The maximum number of errors allowed while parsing objects to set. 140 /// @param value The maximum number of errors allowed while parsing objects to set.
141 /// 141 ///
142 /// @since 12.3 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 /// @brief Retrieves the maximum number of objectstop-level allowed in a container while 148 /// @brief Retrieves the maximum number of objectstop-level allowed in a container while
@@ -155,9 +155,9 @@ namespace qpdf::global @@ -155,9 +155,9 @@ namespace qpdf::global
155 /// objects. 155 /// objects.
156 /// 156 ///
157 /// @since 12.3 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 /// @brief Sets the maximum number oftop-level objects allowed in a container while parsing. 163 /// @brief Sets the maximum number oftop-level objects allowed in a container while parsing.
@@ -169,9 +169,9 @@ namespace qpdf::global @@ -169,9 +169,9 @@ namespace qpdf::global
169 /// parsing objects to set. 169 /// parsing objects to set.
170 /// 170 ///
171 /// @since 12.3 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 /// @brief Retrieves the maximum number of top-level objects allowed in a container while 177 /// @brief Retrieves the maximum number of top-level objects allowed in a container while
@@ -185,9 +185,9 @@ namespace qpdf::global @@ -185,9 +185,9 @@ namespace qpdf::global
185 /// objects. 185 /// objects.
186 /// 186 ///
187 /// @since 12.3 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 /// @brief Sets the maximum number of top-level objects allowed in a container while 193 /// @brief Sets the maximum number of top-level objects allowed in a container while
@@ -201,9 +201,9 @@ namespace qpdf::global @@ -201,9 +201,9 @@ namespace qpdf::global
201 /// parsing objects to set. 201 /// parsing objects to set.
202 /// 202 ///
203 /// @since 12.3 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 } // namespace limits 208 } // namespace limits
209 209
libqpdf/QPDFParser.cc
@@ -15,7 +15,7 @@ using namespace qpdf; @@ -15,7 +15,7 @@ using namespace qpdf;
15 15
16 using ObjectPtr = std::shared_ptr<QPDFObject>; 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 // The ParseGuard class allows QPDFParser to detect re-entrant parsing. It also provides 20 // The ParseGuard class allows QPDFParser to detect re-entrant parsing. It also provides
21 // special access to allow the parser to create unresolved objects and dangling references. 21 // special access to allow the parser to create unresolved objects and dangling references.
@@ -587,7 +587,7 @@ template &lt;typename T, typename... Args&gt; @@ -587,7 +587,7 @@ template &lt;typename T, typename... Args&gt;
587 void 587 void
588 QPDFParser::addScalar(Args&&... args) 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 if (frame->olist.size() > limit || frame->dict.size() > limit) { 591 if (frame->olist.size() > limit || frame->dict.size() > limit) {
592 // Stop adding scalars. We are going to abort when the close token or a bad token is 592 // Stop adding scalars. We are going to abort when the close token or a bad token is
593 // encountered. 593 // encountered.
@@ -645,7 +645,7 @@ QPDFParser::fixMissingKeys() @@ -645,7 +645,7 @@ QPDFParser::fixMissingKeys()
645 void 645 void
646 QPDFParser::check_too_many_bad_tokens() 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 if (frame->olist.size() > limit || frame->dict.size() > limit) { 649 if (frame->olist.size() > limit || frame->dict.size() > limit) {
650 if (bad_count) { 650 if (bad_count) {
651 Limits::error(); 651 Limits::error();
libqpdf/global.cc
@@ -9,24 +9,24 @@ Limits Limits::l; @@ -9,24 +9,24 @@ Limits Limits::l;
9 Options Options::o; 9 Options Options::o;
10 10
11 void 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 if (damaged) { 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 } else { 17 } else {
18 - l.objects_max_container_size_ = value; 18 + l.parser_max_container_size_ = value;
19 } 19 }
20 } 20 }
21 21
22 void 22 void
23 Limits::disable_defaults() 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,17 +41,17 @@ qpdf_global_get_uint32(qpdf_param_e param, uint32_t* value)
41 case qpdf_p_limit_errors: 41 case qpdf_p_limit_errors:
42 *value = Limits::errors(); 42 *value = Limits::errors();
43 return qpdf_r_ok; 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 return qpdf_r_ok; 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 return qpdf_r_ok; 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 return qpdf_r_ok; 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 return qpdf_r_ok; 55 return qpdf_r_ok;
56 default: 56 default:
57 return qpdf_r_bad_parameter; 57 return qpdf_r_bad_parameter;
@@ -65,17 +65,17 @@ qpdf_global_set_uint32(qpdf_param_e param, uint32_t value) @@ -65,17 +65,17 @@ qpdf_global_set_uint32(qpdf_param_e param, uint32_t value)
65 case qpdf_p_default_limits: 65 case qpdf_p_default_limits:
66 Options::default_limits(value); 66 Options::default_limits(value);
67 return qpdf_r_ok; 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 return qpdf_r_ok; 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 return qpdf_r_ok; 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 return qpdf_r_ok; 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 return qpdf_r_ok; 79 return qpdf_r_ok;
80 default: 80 default:
81 return qpdf_r_bad_parameter; 81 return qpdf_r_bad_parameter;
libqpdf/qpdf/QPDFParser.hh
@@ -149,7 +149,7 @@ class QPDFParser @@ -149,7 +149,7 @@ class QPDFParser
149 // it only gets incremented or reset when a bad token is encountered. 149 // it only gets incremented or reset when a bad token is encountered.
150 int bad_count{0}; 150 int bad_count{0};
151 // Number of bad tokens (remaining) before giving up. 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 // Number of good tokens since last bad token. Irrelevant if bad_count == 0. 153 // Number of good tokens since last bad token. Irrelevant if bad_count == 0.
154 int good_count{0}; 154 int good_count{0};
155 // Start offset including any leading whitespace. 155 // Start offset including any leading whitespace.
libqpdf/qpdf/global_private.hh
@@ -16,37 +16,37 @@ namespace qpdf::global @@ -16,37 +16,37 @@ namespace qpdf::global
16 Limits& operator=(Limits&&) = delete; 16 Limits& operator=(Limits&&) = delete;
17 17
18 static uint32_t const& 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 static void 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 static uint32_t const& 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 static void 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 static uint32_t const& 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 /// Record a limit error. 51 /// Record a limit error.
52 static void 52 static void
@@ -73,12 +73,12 @@ namespace qpdf::global @@ -73,12 +73,12 @@ namespace qpdf::global
73 73
74 uint32_t errors_{0}; 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 class Options 84 class Options
libtests/objects.cc
@@ -162,18 +162,18 @@ test_2(QPDF&amp; pdf, char const* arg2) @@ -162,18 +162,18 @@ test_2(QPDF&amp; pdf, char const* arg2)
162 using namespace qpdf::global::limits; 162 using namespace qpdf::global::limits;
163 163
164 // Check default values 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 assert(default_limits()); 169 assert(default_limits());
170 170
171 // Test disabling optional default limits 171 // Test disabling optional default limits
172 default_limits(false); 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 assert(!default_limits()); 177 assert(!default_limits());
178 178
179 // Check disabling default limits is irreversible 179 // Check disabling default limits is irreversible
@@ -181,22 +181,22 @@ test_2(QPDF&amp; pdf, char const* arg2) @@ -181,22 +181,22 @@ test_2(QPDF&amp; pdf, char const* arg2)
181 assert(!default_limits()); 181 assert(!default_limits());
182 182
183 // Test setting limits 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 // Check disabling default limits does not override explicit limits 194 // Check disabling default limits does not override explicit limits
195 default_limits(false); 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 // Test parameter checking 201 // Test parameter checking
202 QUtil::handle_result_code(qpdf_r_ok, ""); 202 QUtil::handle_result_code(qpdf_r_ok, "");
@@ -226,7 +226,7 @@ test_2(QPDF&amp; pdf, char const* arg2) @@ -226,7 +226,7 @@ test_2(QPDF&amp; pdf, char const* arg2)
226 assert(qpdf::global::limit_errors() == 0); 226 assert(qpdf::global::limit_errors() == 0);
227 QPDFObjectHandle::parse("[[[[]]]]"); 227 QPDFObjectHandle::parse("[[[[]]]]");
228 assert(qpdf::global::limit_errors() == 0); 228 assert(qpdf::global::limit_errors() == 0);
229 - objects_max_nesting(3); 229 + parser_max_nesting(3);
230 try { 230 try {
231 QPDFObjectHandle::parse("[[[[[]]]]]"); 231 QPDFObjectHandle::parse("[[[[[]]]]]");
232 } catch (std::exception&) { 232 } catch (std::exception&) {