Skip to content

Commit d50da15

Browse files
committed
Fix heap over-allocation in calculate_heap_usage
Function was using num_bytes in SMALL_BIG_EXT case when estimating heap consumption: the correct input is roughly `num_bytes / sizeof(digit) + align_padding`. Also add `intn_required_digits_for_unsigned_integer` for this purpose to intn.h. This change required newly introduced `size_align_up_pow2` in utils.h. Signed-off-by: Davide Bettio <davide@uninstall.it>
1 parent fb09706 commit d50da15

File tree

2 files changed

+7
-1
lines changed

2 files changed

+7
-1
lines changed

src/libAtomVM/externalterm.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1011,9 +1011,10 @@ static int calculate_heap_usage(const uint8_t *external_term_buf, size_t remaini
10111011
}
10121012

10131013
// num_bytes > 8 bytes || uint64_does_overflow_int64
1014+
size_t required_digits = intn_required_digits_for_unsigned_integer(num_bytes);
10141015
size_t data_size;
10151016
size_t unused_rounded_len;
1016-
term_intn_to_term_size(num_bytes, &data_size, &unused_rounded_len);
1017+
term_intn_to_term_size(required_digits, &data_size, &unused_rounded_len);
10171018
return BOXED_INTN_SIZE(data_size);
10181019
}
10191020

src/libAtomVM/intn.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,11 @@ int intn_to_integer_bytes(const intn_digit_t in[], size_t in_len, intn_integer_s
160160

161161
size_t intn_required_unsigned_integer_bytes(const intn_digit_t in[], size_t in_len);
162162

163+
static inline size_t intn_required_digits_for_unsigned_integer(size_t size_in_bytes)
164+
{
165+
return size_align_up_pow2(size_in_bytes, sizeof(intn_digit_t)) / sizeof(intn_digit_t);
166+
}
167+
163168
static inline intn_integer_sign_t intn_negate_sign(intn_integer_sign_t sign)
164169
{
165170
return (sign == IntNPositiveInteger) ? IntNNegativeInteger : IntNPositiveInteger;

0 commit comments

Comments
 (0)