Skip to content

Commit 71b31a0

Browse files
core: memory exhaustion bug fix (#45)
Signed-off-by: Leonardo Alminana <[email protected]>
1 parent f2dbc3f commit 71b31a0

File tree

1 file changed

+18
-1
lines changed

1 file changed

+18
-1
lines changed

include/ctraces/ctr_variant_utils.h

+18-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222

2323
#include <mpack/mpack.h>
2424

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+
2529
/* These are the only functions meant for general use,
2630
* the reason why the kvlist packing and unpacking
2731
* functions are exposed is the internal and external
@@ -226,12 +230,25 @@ static inline int unpack_cfl_array(mpack_reader_t *reader,
226230

227231
entry_count = mpack_tag_array_count(&tag);
228232

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+
}
230243

231244
if (internal_array == NULL) {
232245
return -3;
233246
}
234247

248+
if (entry_count >= CFL_VARIANT_UTILS_MAXIMUM_FIXED_ARRAY_SIZE) {
249+
cfl_array_resizable(internal_array, CFL_TRUE);
250+
}
251+
235252
for (index = 0 ; index < entry_count ; index++) {
236253
result = unpack_cfl_variant(reader, &entry_value);
237254

0 commit comments

Comments
 (0)