summaryrefslogtreecommitdiff
path: root/kernel/kmalloc.c
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-04-27 18:32:32 +0200
committerAnton Kling <anton@kling.gg>2024-04-27 18:32:32 +0200
commite3ff175cc3a5fdd1d65a34d081955b9808c49eca (patch)
tree3cf41a97d8800ca92c4781847185975a0c95dbef /kernel/kmalloc.c
parent02c27583a539c4e8073509536d328581cf1ba346 (diff)
Kernel: Make "relist" able to dynamically resize
Diffstat (limited to 'kernel/kmalloc.c')
-rw-r--r--kernel/kmalloc.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/kernel/kmalloc.c b/kernel/kmalloc.c
index 12e8232..ce96d54 100644
--- a/kernel/kmalloc.c
+++ b/kernel/kmalloc.c
@@ -236,6 +236,27 @@ void *kallocarray(size_t nmemb, size_t size) {
return kreallocarray(NULL, nmemb, size);
}
+void *krecalloc(void *ptr, size_t nelem, size_t elsize) {
+ if ((nelem >= MUL_NO_OVERFLOW || elsize >= MUL_NO_OVERFLOW) && nelem > 0 &&
+ SIZE_MAX / nelem < elsize) {
+ return NULL;
+ }
+ if (!ptr) {
+ return kcalloc(nelem, elsize);
+ }
+ size_t new_size = nelem * elsize;
+ void *rc = int_kmalloc(new_size);
+ if (!rc) {
+ return NULL;
+ }
+ size_t l = get_mem_size(ptr);
+ size_t to_copy = min(l, new_size);
+ memset(rc, 0, new_size);
+ memcpy(rc, ptr, to_copy);
+ kfree(ptr);
+ return rc;
+}
+
void *kcalloc(size_t nelem, size_t elsize) {
if ((nelem >= MUL_NO_OVERFLOW || elsize >= MUL_NO_OVERFLOW) && nelem > 0 &&
SIZE_MAX / nelem < elsize) {