From 56e6e20dbc29fd1906f8616a5eb1fafb9637a61c Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Tue, 24 Jun 2025 02:32:23 -0400 Subject: usr: libc: Add realloc() Implement realloc() to resize allocated memory from malloc() Signed-off-by: Ian Moffett --- lib/libc/include/stdlib.h | 1 + lib/libc/src/stdlib/malloc.c | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) (limited to 'lib') diff --git a/lib/libc/include/stdlib.h b/lib/libc/include/stdlib.h index 97c777b..b1de3f3 100644 --- a/lib/libc/include/stdlib.h +++ b/lib/libc/include/stdlib.h @@ -86,6 +86,7 @@ __dead void _Exit(int status); #endif void *malloc(size_t size); +void *realloc(void *ptr, size_t size); void free(void *ptr); void srand(unsigned int r); diff --git a/lib/libc/src/stdlib/malloc.c b/lib/libc/src/stdlib/malloc.c index 1c9e8ca..4f25c24 100644 --- a/lib/libc/src/stdlib/malloc.c +++ b/lib/libc/src/stdlib/malloc.c @@ -36,6 +36,7 @@ #include #include #include +#include #define HEAP_SIZE 0x1001A8 #define HEAP_MAGIC 0x05306A /* "OSMORA" :~) */ @@ -163,6 +164,26 @@ malloc(size_t size) return PTR_OFFSET(next_block, sizeof(*next_block)); } +void * +realloc(void *ptr, size_t size) +{ + struct mem_block *blk; + void *new_buf; + + blk = PTR_NOFFSET(ptr, sizeof(*blk)); + if (blk->magic != HEAP_MAGIC) { + __heap_abort("realloc: bad realloc block detected\n"); + } + if (!blk->allocated) { + __heap_abort("realloc: bad realloc\n"); + } + + new_buf = malloc(size); + memcpy(new_buf, ptr, blk->size); + free(ptr); + return new_buf; +} + void free(void *ptr) { -- cgit v1.2.3