src: fix pointer alignment · nodejs/node@4f832b1

@@ -8,6 +8,8 @@

8899

namespace node {

1010

namespace mem {

11+

static constexpr size_t kReserveSizeAndAlign =

12+

std::max(sizeof(size_t), alignof(max_align_t));

11131214

template <typename Class, typename AllocatorStruct>

1315

AllocatorStruct NgLibMemoryManager<Class, AllocatorStruct>::MakeAllocator() {

@@ -30,19 +32,18 @@ void* NgLibMemoryManager<Class, T>::ReallocImpl(void* ptr,

3032

char* 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;

35373638

if (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.

4143

if (previous_size == 0) {

4244

// Fall back to the standard Realloc() function.

4345

char* ret = UncheckedRealloc(original_ptr, size);

44-

if (ret != nullptr)

45-

ret += sizeof(size_t);

46+

if (ret != nullptr) ret += kReserveSizeAndAlign;

4647

return 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,

95969697

template <typename Class, typename T>

9798

void 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(