From 78eb30d67f006dfc40d1a9fed7b9b3d142c816e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nils=20O=2E=20Sel=C3=A5sdal?= Date: Tue, 9 Jun 2026 14:43:04 +0200 Subject: [PATCH] Prevent a few edge case overflows --- src/arena.c | 4 ++-- src/arena.h | 2 +- src/main.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/arena.c b/src/arena.c index 1deddf4..050ae6d 100644 --- a/src/arena.c +++ b/src/arena.c @@ -60,10 +60,10 @@ void *arena_push(Arena *arena, U32 size, U32 align) Assert(IsPow2(align)); MemoryBlock *block = arena->current; - U32 start_pos = AlignUpPow2(block->pos, align); + U32 start_pos = AlignUpPow2(block->pos, align); // might align past block->size U32 available = block->size - start_pos; - if (available < size) { + if (start_pos > block->size || available < size) { U32 block_size = arena->block_size; // original user requested size U32 new_commit_size = arena->commit_size; if (size > block_size - MemoryBlock_Header_Size) { diff --git a/src/arena.h b/src/arena.h index b7e2702..52be752 100644 --- a/src/arena.h +++ b/src/arena.h @@ -16,7 +16,7 @@ struct MemoryBlock { U8 *base; U32 size; // Block size, page aligned U32 pos; // start of next allocation - U32 base_pos; // absolute position of base relative to the first linked arena + U64 base_pos; // absolute position of base relative to the first linked arena U32 committed_pos; // end of committed region. Will be page aligned MemoryBlock *prev; }; diff --git a/src/main.c b/src/main.c index e3cd66f..011eafb 100644 --- a/src/main.c +++ b/src/main.c @@ -13,7 +13,7 @@ void arena_dump(const Arena *arena) printf("base: %p\n", block->base); printf("size: %u\n", block->size); printf("pos: %u\n", block->pos); - printf("base_pos: %u\n", block->base_pos); + printf("base_pos: %lu\n",block->base_pos); printf("prev: %p\n", block->prev); puts("-----Arena end-"); block = block->prev;