diff --git a/src/calloc.cpp b/src/calloc.cpp index ccf931c..55f1c78 100644 --- a/src/calloc.cpp +++ b/src/calloc.cpp @@ -1,4 +1,5 @@ #include "malloc_from_scratch/memory_allocator.h" + #include namespace mem @@ -6,9 +7,14 @@ namespace mem void* calloc(size_t num, size_t size) { + if (num == 0 || size == 0) + { + return nullptr; + } + size_t total_size = num * size; size_t overflow_check = total_size / num; - if (overflow_check != size && num > 0 && size > 0) + if (overflow_check != size) { return nullptr; } diff --git a/src/realloc.cpp b/src/realloc.cpp index 7820244..9839475 100644 --- a/src/realloc.cpp +++ b/src/realloc.cpp @@ -1,4 +1,8 @@ #include "malloc_from_scratch/memory_allocator.h" +#include "malloc_from_scratch/memory_internal.h" + +#include +#include namespace mem { @@ -16,12 +20,41 @@ void* realloc(void* ptr, size_t new_size) return nullptr; } + if (!internal::isPointerInHeap(ptr)) + { + return nullptr; + } + + internal::MemoryBlock* old_block = internal::getMetadata(ptr); + if (!internal::isValidBlock(old_block)) + { + return nullptr; + } + + if (!internal::checkCanary(old_block)) + { + exit(-1); + } + + size_t old_size = old_block->size_; + void* new_ptr = malloc(new_size); if (new_ptr == nullptr) { return nullptr; } + size_t copy_size; + if (old_size < new_size) + { + copy_size = old_size; + } + else + { + copy_size = new_size; + } + memcpy(new_ptr, ptr, copy_size); + free(ptr); return new_ptr;