Skip to content

Commit

Permalink
[scudo] Compute the default aligned pointer without tag (#92989)
Browse files Browse the repository at this point in the history
#83493 slightly
changed the order of computation of block addresses and
pointers, causing the value of DefaultAlignedPtr to
include the MTE tag. Move this computation earlier so it
matches the old behavior.

This fixes a UBSan failure in Trusty:
secure os: UBSan: (overflow:-)
external/scudo/standalone/combined.h:1070:35
secure os: Details: unsigned integer overflow: 8988807738704 -
144124176883594576 cannot be represented in type 'uptr'
  • Loading branch information
ahomescu authored May 23, 2024
1 parent 8cc8e5d commit b17d445
Showing 1 changed file with 8 additions and 4 deletions.
12 changes: 8 additions & 4 deletions compiler-rt/lib/scudo/standalone/combined.h
Original file line number Diff line number Diff line change
Expand Up @@ -1052,6 +1052,10 @@ class Allocator {
void *Block, const uptr UserPtr,
const uptr SizeOrUnusedBytes,
const FillContentsMode FillContents) {
// Compute the default pointer before adding the header tag
const uptr DefaultAlignedPtr =
reinterpret_cast<uptr>(Block) + Chunk::getHeaderSize();

Block = addHeaderTag(Block);
// Only do content fill when it's from primary allocator because secondary
// allocator has filled the content.
Expand All @@ -1064,8 +1068,6 @@ class Allocator {

Chunk::UnpackedHeader Header = {};

const uptr DefaultAlignedPtr =
reinterpret_cast<uptr>(Block) + Chunk::getHeaderSize();
if (UNLIKELY(DefaultAlignedPtr != UserPtr)) {
const uptr Offset = UserPtr - DefaultAlignedPtr;
DCHECK_GE(Offset, 2 * sizeof(u32));
Expand Down Expand Up @@ -1096,6 +1098,10 @@ class Allocator {
const Options Options = Primary.Options.load();
DCHECK(useMemoryTagging<AllocatorConfig>(Options));

// Compute the default pointer before adding the header tag
const uptr DefaultAlignedPtr =
reinterpret_cast<uptr>(Block) + Chunk::getHeaderSize();

void *Ptr = reinterpret_cast<void *>(UserPtr);
void *TaggedPtr = Ptr;

Expand Down Expand Up @@ -1194,8 +1200,6 @@ class Allocator {

Chunk::UnpackedHeader Header = {};

const uptr DefaultAlignedPtr =
reinterpret_cast<uptr>(Block) + Chunk::getHeaderSize();
if (UNLIKELY(DefaultAlignedPtr != UserPtr)) {
const uptr Offset = UserPtr - DefaultAlignedPtr;
DCHECK_GE(Offset, 2 * sizeof(u32));
Expand Down

0 comments on commit b17d445

Please sign in to comment.