src: fix pointer alignment · nodejs/node@4f832b1
@@ -8,6 +8,8 @@
8899namespace node {
1010namespace mem {
11+static constexpr size_t kReserveSizeAndAlign =
12+std::max(sizeof(size_t), alignof(max_align_t));
11131214template <typename Class, typename AllocatorStruct>
1315AllocatorStruct NgLibMemoryManager<Class, AllocatorStruct>::MakeAllocator() {
@@ -30,19 +32,18 @@ void* NgLibMemoryManager<Class, T>::ReallocImpl(void* ptr,
3032char* original_ptr = nullptr;
31333234// We prepend each allocated buffer with a size_t containing the full
33-// size of the allocation.
34-if (size > 0) size += sizeof(size_t);
35+// size of the allocation, while keeping the returned pointer aligned.
36+if (size > 0) size += kReserveSizeAndAlign;
35373638if (ptr != nullptr) {
3739// We are free()ing or re-allocating.
38- original_ptr = static_cast<char*>(ptr) - sizeof(size_t);
40+ original_ptr = static_cast<char*>(ptr) - kReserveSizeAndAlign;
3941 previous_size = *reinterpret_cast<size_t*>(original_ptr);
4042// This means we called StopTracking() on this pointer before.
4143if (previous_size == 0) {
4244// Fall back to the standard Realloc() function.
4345char* ret = UncheckedRealloc(original_ptr, size);
44-if (ret != nullptr)
45- ret += sizeof(size_t);
46+if (ret != nullptr) ret += kReserveSizeAndAlign;
4647return ret;
4748 }
4849 }
@@ -62,7 +63,7 @@ void* NgLibMemoryManager<Class, T>::ReallocImpl(void* ptr,
6263 manager->env()->external_memory_accounter()->Update(
6364 manager->env()->isolate(), new_size);
6465 *reinterpret_cast<size_t*>(mem) = size;
65- mem += sizeof(size_t);
66+ mem += kReserveSizeAndAlign;
6667 } else if (size == 0) {
6768 manager->DecreaseAllocatedSize(previous_size);
6869 manager->env()->external_memory_accounter()->Decrease(
@@ -95,8 +96,8 @@ void* NgLibMemoryManager<Class, T>::CallocImpl(size_t nmemb,
95969697template <typename Class, typename T>
9798void NgLibMemoryManager<Class, T>::StopTrackingMemory(void* ptr) {
98-size_t* original_ptr = reinterpret_cast<size_t*>(
99-static_cast<char*>(ptr) - sizeof(size_t));
99+size_t* original_ptr =
100+reinterpret_cast<size_t*>(static_cast<char*>(ptr) - kReserveSizeAndAlign);
100101 Class* manager = static_cast<Class*>(this);
101102 manager->DecreaseAllocatedSize(*original_ptr);
102103 manager->env()->external_memory_accounter()->Decrease(