diff options
author | Ian Moffett <ian@osmora.org> | 2025-06-24 02:32:23 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-06-24 02:32:23 -0400 |
commit | 56e6e20dbc29fd1906f8616a5eb1fafb9637a61c (patch) | |
tree | 33ba89b790ef5089bb349d3fa1e765978e730f5d /lib/libc | |
parent | c12bb17d66fa58422a0d50b4242a7507852d0405 (diff) |
usr: libc: Add realloc()
Implement realloc() to resize allocated memory from malloc()
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'lib/libc')
-rw-r--r-- | lib/libc/include/stdlib.h | 1 | ||||
-rw-r--r-- | lib/libc/src/stdlib/malloc.c | 21 |
2 files changed, 22 insertions, 0 deletions
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 <stdatomic.h> #include <stdio.h> #include <stdbool.h> +#include <string.h> #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) { |