From d932e0cb41086e4b2859041bc120611fde596bd7 Mon Sep 17 00:00:00 2001 From: Aaron Boxer Date: Tue, 18 Nov 2025 08:53:08 -0500 Subject: [PATCH] vector: grow exponentially to reduce number of reallocs --- src/utils/vector.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/utils/vector.c b/src/utils/vector.c index 15c948b..2efc00e 100644 --- a/src/utils/vector.c +++ b/src/utils/vector.c @@ -99,14 +99,25 @@ parserutils_error parserutils_vector_append(parserutils_vector *vector, slot = vector->current_item + 1; if ((size_t) slot >= vector->items_allocated) { - void *temp = realloc(vector->items, - (vector->items_allocated + vector->chunk_size) * - vector->item_size); + /* Exponential growth: double current allocation, + but at least add chunk_size */ + size_t new_allocated = vector->items_allocated * 2; + void *temp; + + if (new_allocated < vector->items_allocated + vector->chunk_size) + new_allocated = vector->items_allocated + vector->chunk_size; + + /* Overflow check */ + if (new_allocated < vector->items_allocated || + new_allocated > SIZE_MAX / vector->item_size) + return PARSERUTILS_NOMEM; + + temp = realloc(vector->items, new_allocated * vector->item_size); if (temp == NULL) return PARSERUTILS_NOMEM; vector->items = temp; - vector->items_allocated += vector->chunk_size; + vector->items_allocated = new_allocated; } memcpy((uint8_t *) vector->items + (slot * vector->item_size),