summaryrefslogtreecommitdiff
path: root/lib/libc/src/stdlib/malloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/src/stdlib/malloc.c')
-rw-r--r--lib/libc/src/stdlib/malloc.c21
1 files changed, 21 insertions, 0 deletions
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)
{