diff --git a/compiler-rt/lib/gwp_asan/common.h b/compiler-rt/lib/gwp_asan/common.h --- a/compiler-rt/lib/gwp_asan/common.h +++ b/compiler-rt/lib/gwp_asan/common.h @@ -22,16 +22,22 @@ // Magic header that resides in the AllocatorState so that GWP-ASan bugreports // can be understood by tools at different versions. Out-of-process crash -// handlers, like crashpad on Fuchsia, take the raw conents of the +// handlers, like crashpad on Fuchsia, take the raw contents of the // AllocationMetatada array and the AllocatorState, and shove them into the // minidump. Online unpacking of these structs needs to know from which version -// of GWP-ASan its extracting the information, as the structures are not stable. +// of GWP-ASan it's extracting the information, as the structures are not +// stable. struct AllocatorVersionMagic { - const uint8_t Magic[4] = {'A', 'S', 'A', 'N'}; + // The values are copied into the structure at runtime, during + // `GuardedPoolAllocator::init()` so that GWP-ASan remains completely in the + // `.bss` segment. + static constexpr uint8_t kAllocatorVersionMagic[4] = {'A', 'S', 'A', 'N'}; + uint8_t Magic[4] = {}; // Update the version number when the AllocatorState or AllocationMetadata // change. - const uint16_t Version = 1; - const uint16_t Reserved = 0; + static constexpr uint16_t kAllocatorVersion = 1; + uint16_t Version = 0; + uint16_t Reserved = 0; }; enum class Error : uint8_t { @@ -99,7 +105,7 @@ // set of information required for understanding a GWP-ASan crash. struct AllocatorState { constexpr AllocatorState() {} - const AllocatorVersionMagic VersionMagic{}; + AllocatorVersionMagic VersionMagic{}; // Returns whether the provided pointer is a current sampled allocation that // is owned by this pool. diff --git a/compiler-rt/lib/gwp_asan/guarded_pool_allocator.cpp b/compiler-rt/lib/gwp_asan/guarded_pool_allocator.cpp --- a/compiler-rt/lib/gwp_asan/guarded_pool_allocator.cpp +++ b/compiler-rt/lib/gwp_asan/guarded_pool_allocator.cpp @@ -59,6 +59,13 @@ SingletonPtr = this; Backtrace = Opts.Backtrace; + State.VersionMagic = {{AllocatorVersionMagic::kAllocatorVersionMagic[0], + AllocatorVersionMagic::kAllocatorVersionMagic[1], + AllocatorVersionMagic::kAllocatorVersionMagic[2], + AllocatorVersionMagic::kAllocatorVersionMagic[3]}, + AllocatorVersionMagic::kAllocatorVersion, + 0}; + State.MaxSimultaneousAllocations = Opts.MaxSimultaneousAllocations; const size_t PageSize = getPlatformPageSize();