@@ -608,7 +608,8 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork { |
608 | 608 | } |
609 | 609 |
|
610 | 610 | static void* AllocForBrotli(void* data, size_t size) { |
611 | | - size += sizeof(size_t); |
| 611 | + constexpr size_t offset = std::max(sizeof(size_t), alignof(max_align_t)); |
| 612 | + size += offset; |
612 | 613 | CompressionStream* ctx = static_cast<CompressionStream*>(data); |
613 | 614 | char* memory = UncheckedMalloc(size); |
614 | 615 | if (memory == nullptr) [[unlikely]] { |
@@ -617,15 +618,16 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork { |
617 | 618 | *reinterpret_cast<size_t*>(memory) = size; |
618 | 619 | ctx->unreported_allocations_.fetch_add(size, |
619 | 620 | std::memory_order_relaxed); |
620 | | - return memory + sizeof(size_t); |
| 621 | + return memory + offset; |
621 | 622 | } |
622 | 623 |
|
623 | 624 | static void FreeForZlib(void* data, void* pointer) { |
624 | 625 | if (pointer == nullptr) [[unlikely]] { |
625 | 626 | return; |
626 | 627 | } |
627 | 628 | CompressionStream* ctx = static_cast<CompressionStream*>(data); |
628 | | - char* real_pointer = static_cast<char*>(pointer) - sizeof(size_t); |
| 629 | + constexpr size_t offset = std::max(sizeof(size_t), alignof(max_align_t)); |
| 630 | + char* real_pointer = static_cast<char*>(pointer) - offset; |
629 | 631 | size_t real_size = *reinterpret_cast<size_t*>(real_pointer); |
630 | 632 | ctx->unreported_allocations_.fetch_sub(real_size, |
631 | 633 | std::memory_order_relaxed); |
|