diff --git a/compiler-rt/lib/scudo/standalone/combined.h b/compiler-rt/lib/scudo/standalone/combined.h --- a/compiler-rt/lib/scudo/standalone/combined.h +++ b/compiler-rt/lib/scudo/standalone/combined.h @@ -221,11 +221,13 @@ if (UNLIKELY(ZeroContents && ClassId)) memset(Block, 0, PrimaryT::getSizeByClassId(ClassId)); + const uptr UnalignedUserPtr = + reinterpret_cast(Block) + Chunk::getHeaderSize(); + const uptr UserPtr = roundUpTo(UnalignedUserPtr, Alignment); + Chunk::UnpackedHeader Header = {}; - uptr UserPtr = reinterpret_cast(Block) + Chunk::getHeaderSize(); - if (UNLIKELY(!isAligned(UserPtr, Alignment))) { - const uptr AlignedUserPtr = roundUpTo(UserPtr, Alignment); - const uptr Offset = AlignedUserPtr - UserPtr; + if (UNLIKELY(UnalignedUserPtr != UserPtr)) { + const uptr Offset = UserPtr - UnalignedUserPtr; DCHECK_GE(Offset, 2 * sizeof(u32)); // The BlockMarker has no security purpose, but is specifically meant for // the chunk iteration function that can be used in debugging situations. @@ -233,7 +235,6 @@ // based on its block address. reinterpret_cast(Block)[0] = BlockMarker; reinterpret_cast(Block)[1] = static_cast(Offset); - UserPtr = AlignedUserPtr; Header.Offset = (Offset >> MinAlignmentLog) & Chunk::OffsetMask; } Header.ClassId = ClassId & Chunk::ClassIdMask;