#include <isc/heap.h>
#include <isc/magic.h>
#include <isc/mem.h>
+#include <isc/overflow.h>
#include <isc/string.h> /* Required for memmove. */
#include <isc/util.h>
static void
resize(isc_heap_t *heap) {
- void **new_array;
- unsigned int new_size;
+ unsigned int new_size, new_bytes, old_bytes;
REQUIRE(VALID_HEAP(heap));
- new_size = heap->size + heap->size_increment;
- new_array = isc_mem_get(heap->mctx, new_size * sizeof(void *));
- if (heap->array != NULL) {
- memmove(new_array, heap->array, heap->size * sizeof(void *));
- isc_mem_put(heap->mctx, heap->array,
- heap->size * sizeof(void *));
- }
+ new_size = ISC_CHECKED_ADD(heap->size, heap->size_increment);
+ new_bytes = ISC_CHECKED_MUL(new_size, sizeof(void *));
+ old_bytes = ISC_CHECKED_MUL(heap->size, sizeof(void *));
+
heap->size = new_size;
- heap->array = new_array;
+ heap->array = isc_mem_reget(heap->mctx, heap->array, old_bytes,
+ new_bytes);
}
static void