summaryrefslogtreecommitdiff
path: root/lib/libc
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-06-24 02:32:23 -0400
committerIan Moffett <ian@osmora.org>2025-06-24 02:32:23 -0400
commit56e6e20dbc29fd1906f8616a5eb1fafb9637a61c (patch)
tree33ba89b790ef5089bb349d3fa1e765978e730f5d /lib/libc
parentc12bb17d66fa58422a0d50b4242a7507852d0405 (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.h1
-rw-r--r--lib/libc/src/stdlib/malloc.c21
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)
{