aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFeoramund <161657516+Feoramund@users.noreply.github.com>2024-05-28 19:49:56 -0400
committerFeoramund <161657516+Feoramund@users.noreply.github.com>2024-06-02 14:47:06 -0400
commiteadfbb13185a94a30d87c52eb50e83fcec8e0d52 (patch)
treed62e5be90d2cf227f83568271b0118dd8583fd5f
parent1afc235359334aa2b7df0e4b4c79386763076e75 (diff)
Forbid singleton allocations from shrinking their block offset
-rw-r--r--core/mem/rollback_stack_allocator.odin6
1 files changed, 5 insertions, 1 deletions
diff --git a/core/mem/rollback_stack_allocator.odin b/core/mem/rollback_stack_allocator.odin
index a3f6647cf..b86f514ec 100644
--- a/core/mem/rollback_stack_allocator.odin
+++ b/core/mem/rollback_stack_allocator.odin
@@ -155,7 +155,11 @@ rb_resize :: proc(stack: ^Rollback_Stack, ptr: rawptr, old_size, size, alignment
assert(block.offset >= cast(uintptr)old_size, "Rollback Stack Allocator received invalid `old_size`.")
if block.offset + cast(uintptr)size - cast(uintptr)old_size < cast(uintptr)len(block.buffer) {
- block.offset += cast(uintptr)size - cast(uintptr)old_size
+ // Prevent singleton allocations from fragmenting by forbidding
+ // them to shrink, removing the possibility of overflow bugs.
+ if len(block.buffer) <= stack.block_size {
+ block.offset += cast(uintptr)size - cast(uintptr)old_size
+ }
#no_bounds_check return (cast([^]byte)ptr)[:size], nil
}
}