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