From 65c67d317a4d1c59f978cd43a1a1177fbb420e7b Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Mon, 17 Jul 2023 14:46:00 +0200 Subject: [PATCH] AllocatorLog: support nulls in `deallocate()` and `reallocate()` --- extras/tests/Helpers/Allocators.hpp | 7 ++++--- extras/tests/JsonDocument/shrinkToFit.cpp | 6 ++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/extras/tests/Helpers/Allocators.hpp b/extras/tests/Helpers/Allocators.hpp index 4a44b746..f37658f9 100644 --- a/extras/tests/Helpers/Allocators.hpp +++ b/extras/tests/Helpers/Allocators.hpp @@ -109,18 +109,17 @@ class SpyingAllocator : public ArduinoJson::Allocator { void deallocate(void* p) override { auto block = AllocatedBlock::fromPayload(p); - log_ << AllocatorLog::Deallocate(block->size); + log_ << AllocatorLog::Deallocate(block ? block->size : 0); upstream_->deallocate(block); } void* reallocate(void* p, size_t n) override { auto block = AllocatedBlock::fromPayload(p); - auto oldSize = block->size; + auto oldSize = block ? block->size : 0; block = reinterpret_cast( upstream_->reallocate(block, sizeof(AllocatedBlock) + n - 1)); if (block) { log_ << AllocatorLog::Reallocate(oldSize, n); - ARDUINOJSON_ASSERT(block->size == oldSize); block->size = n; return block->payload; } else { @@ -143,6 +142,8 @@ class SpyingAllocator : public ArduinoJson::Allocator { char payload[1]; static AllocatedBlock* fromPayload(void* p) { + if (!p) + return nullptr; return reinterpret_cast( // Cast to void* to silence "cast increases required alignment of // target type [-Werror=cast-align]" diff --git a/extras/tests/JsonDocument/shrinkToFit.cpp b/extras/tests/JsonDocument/shrinkToFit.cpp index 39d26eeb..5600e3ad 100644 --- a/extras/tests/JsonDocument/shrinkToFit.cpp +++ b/extras/tests/JsonDocument/shrinkToFit.cpp @@ -31,8 +31,10 @@ class ArmoredAllocator : public Allocator { // this way we make sure we support relocation void* new_ptr = malloc(new_size); memset(new_ptr, '#', new_size); // erase - memcpy(new_ptr, ptr, std::min(new_size, new_size)); - free(ptr); + if (ptr) { + memcpy(new_ptr, ptr, std::min(new_size, new_size)); + free(ptr); + } return new_ptr; } };