|
22 | 22 |
|
23 | 23 | #include <mpack/mpack.h>
|
24 | 24 |
|
| 25 | +#define CFL_VARIANT_UTILS_MAXIMUM_FIXED_ARRAY_SIZE 100 |
| 26 | +#define CFL_VARIANT_UTILS_INITIAL_ARRAY_SIZE 100 |
| 27 | +#define CFL_VARIANT_UTILS_SERIALIZED_ARRAY_SIZE_LIMIT 100000 |
| 28 | + |
25 | 29 | /* These are the only functions meant for general use,
|
26 | 30 | * the reason why the kvlist packing and unpacking
|
27 | 31 | * functions are exposed is the internal and external
|
@@ -226,12 +230,25 @@ static inline int unpack_cfl_array(mpack_reader_t *reader,
|
226 | 230 |
|
227 | 231 | entry_count = mpack_tag_array_count(&tag);
|
228 | 232 |
|
229 |
| - internal_array = cfl_array_create(entry_count); |
| 233 | + if (entry_count >= CFL_VARIANT_UTILS_SERIALIZED_ARRAY_SIZE_LIMIT) { |
| 234 | + return -2; |
| 235 | + } |
| 236 | + |
| 237 | + if (entry_count >= CFL_VARIANT_UTILS_MAXIMUM_FIXED_ARRAY_SIZE) { |
| 238 | + internal_array = cfl_array_create(CFL_VARIANT_UTILS_INITIAL_ARRAY_SIZE); |
| 239 | + } |
| 240 | + else { |
| 241 | + internal_array = cfl_array_create(entry_count); |
| 242 | + } |
230 | 243 |
|
231 | 244 | if (internal_array == NULL) {
|
232 | 245 | return -3;
|
233 | 246 | }
|
234 | 247 |
|
| 248 | + if (entry_count >= CFL_VARIANT_UTILS_MAXIMUM_FIXED_ARRAY_SIZE) { |
| 249 | + cfl_array_resizable(internal_array, CFL_TRUE); |
| 250 | + } |
| 251 | + |
235 | 252 | for (index = 0 ; index < entry_count ; index++) {
|
236 | 253 | result = unpack_cfl_variant(reader, &entry_value);
|
237 | 254 |
|
@@ -595,7 +612,7 @@ static inline int unpack_cfl_variant(mpack_reader_t *reader,
|
595 | 612 | if (value_type == mpack_type_str) {
|
596 | 613 | result = unpack_cfl_variant_string(reader, value);
|
597 | 614 | }
|
598 |
| - else if (value_type == mpack_type_str) { |
| 615 | + else if (value_type == mpack_type_bool) { |
599 | 616 | result = unpack_cfl_variant_boolean(reader, value);
|
600 | 617 | }
|
601 | 618 | else if (value_type == mpack_type_int) {
|
|
0 commit comments