diff options
author | Anton Kling <anton@kling.gg> | 2024-04-27 18:32:32 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-04-27 18:32:32 +0200 |
commit | e3ff175cc3a5fdd1d65a34d081955b9808c49eca (patch) | |
tree | 3cf41a97d8800ca92c4781847185975a0c95dbef /kernel/kmalloc.c | |
parent | 02c27583a539c4e8073509536d328581cf1ba346 (diff) |
Kernel: Make "relist" able to dynamically resize
Diffstat (limited to 'kernel/kmalloc.c')
-rw-r--r-- | kernel/kmalloc.c | 21 |
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) { |