From 365de4b5051e83da721395fd9423d2228f3a8dd0 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 23 Dec 2022 09:50:34 +1100 Subject: [PATCH] AP_HAL_ChibiOS: added old_size to heap_realloc --- libraries/AP_HAL_ChibiOS/Util.cpp | 10 ++++++++-- libraries/AP_HAL_ChibiOS/Util.h | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/libraries/AP_HAL_ChibiOS/Util.cpp b/libraries/AP_HAL_ChibiOS/Util.cpp index 1f513239a6..29aaa6298a 100644 --- a/libraries/AP_HAL_ChibiOS/Util.cpp +++ b/libraries/AP_HAL_ChibiOS/Util.cpp @@ -118,7 +118,7 @@ void *Util::std_realloc(void *addr, size_t size) return new_mem; } -void *Util::heap_realloc(void *heap, void *ptr, size_t new_size) +void *Util::heap_realloc(void *heap, void *ptr, size_t old_size, size_t new_size) { if (heap == nullptr) { return nullptr; @@ -134,7 +134,13 @@ void *Util::heap_realloc(void *heap, void *ptr, size_t new_size) } void *new_mem = chHeapAlloc((memory_heap_t *)heap, new_size); if (new_mem != nullptr) { - memcpy(new_mem, ptr, chHeapGetSize(ptr) > new_size ? new_size : chHeapGetSize(ptr)); + const size_t old_size2 = chHeapGetSize(ptr); +#ifdef HAL_DEBUG_BUILD + if (new_size != 0 && old_size2 != old_size) { + INTERNAL_ERROR(AP_InternalError::error_t::invalid_arg_or_result); + } +#endif + memcpy(new_mem, ptr, old_size2 > new_size ? new_size : old_size2); chHeapFree(ptr); } return new_mem; diff --git a/libraries/AP_HAL_ChibiOS/Util.h b/libraries/AP_HAL_ChibiOS/Util.h index dcc5fd3dab..73d189d809 100644 --- a/libraries/AP_HAL_ChibiOS/Util.h +++ b/libraries/AP_HAL_ChibiOS/Util.h @@ -46,7 +46,7 @@ public: #ifdef ENABLE_HEAP // heap functions, note that a heap once alloc'd cannot be dealloc'd virtual void *allocate_heap_memory(size_t size) override; - virtual void *heap_realloc(void *heap, void *ptr, size_t new_size) override; + virtual void *heap_realloc(void *heap, void *ptr, size_t old_size, size_t new_size) override; virtual void *std_realloc(void *ptr, size_t new_size) override; #endif // ENABLE_HEAP