[scudo][standalone] Fuchsia related fixes

While attempting to roll the latest Scudo in Fuchsia, some issues
arose. While trying to debug them, it appeared that `DCHECK`s were
also never exercised in Fuchsia. This CL fixes the following
problems:
- the size of a block in the TransferBatch class must be a multiple
  of the compact pointer scale. In some cases, it wasn't true, which
  lead to obscure crashes. Now, we round up `sizeof(TransferBatch)`.
  This only materialized in Fuchsia due to the specific parameters
  of the `DefaultConfig`;
- 2 `DCHECK` statements in Fuchsia were incorrect;
- `map()` & co. require a size multiple of a page (as enforced in
  Fuchsia `DCHECK`s), which wasn't the case for `PackedCounters`.
- In the Secondary, a parameter was marked as `UNUSED` while it is
  actually used.

Differential Revision: https://reviews.llvm.org/D100524
This commit is contained in:
Kostya Kortchinsky 2021-04-14 21:09:20 -07:00
parent 07edd78993
commit 3f97c66b00
4 changed files with 11 additions and 7 deletions

View File

@ -49,7 +49,7 @@ static void *allocateVmar(uptr Size, MapPlatformData *Data, bool AllowNoMem) {
void *map(void *Addr, uptr Size, const char *Name, uptr Flags,
MapPlatformData *Data) {
DCHECK_EQ(Size % PAGE_SIZE, 0);
DCHECK_EQ(Size % getPageSizeCached(), 0);
const bool AllowNoMem = !!(Flags & MAP_ALLOWNOMEM);
// For MAP_NOACCESS, just allocate a Vmar and return.
@ -96,8 +96,10 @@ void *map(void *Addr, uptr Size, const char *Name, uptr Flags,
// No need to track the Vmo if we don't intend on resizing it. Close it.
if (Flags & MAP_RESIZABLE) {
DCHECK(Data);
DCHECK_EQ(Data->Vmo, ZX_HANDLE_INVALID);
Data->Vmo = Vmo;
if (Data->Vmo == ZX_HANDLE_INVALID)
Data->Vmo = Vmo;
else
DCHECK_EQ(Data->Vmo, Vmo);
} else {
CHECK_EQ(_zx_handle_close(Vmo), ZX_OK);
}

View File

@ -51,7 +51,7 @@ public:
static uptr getSizeByClassId(uptr ClassId) {
return (ClassId == SizeClassMap::BatchClassId)
? sizeof(TransferBatch)
? roundUpTo(sizeof(TransferBatch), 1U << CompactPtrScale)
: SizeClassMap::getSizeByClassId(ClassId);
}

View File

@ -81,7 +81,8 @@ public:
memset(Buffer, 0, BufferSize);
} else {
Buffer = reinterpret_cast<uptr *>(
map(nullptr, BufferSize, "scudo:counters", MAP_ALLOWNOMEM));
map(nullptr, roundUpTo(BufferSize, getPageSizeCached()),
"scudo:counters", MAP_ALLOWNOMEM));
}
}
~PackedCounterArray() {
@ -90,7 +91,8 @@ public:
if (Buffer == &StaticBuffer[0])
Mutex.unlock();
else
unmap(reinterpret_cast<void *>(Buffer), BufferSize);
unmap(reinterpret_cast<void *>(Buffer),
roundUpTo(BufferSize, getPageSizeCached()));
}
bool isAllocated() const { return !!Buffer; }

View File

@ -69,7 +69,7 @@ public:
UNUSED LargeBlock::Header **H, UNUSED bool *Zeroed) {
return false;
}
void store(UNUSED Options Options, UNUSED LargeBlock::Header *H) { unmap(H); }
void store(UNUSED Options Options, LargeBlock::Header *H) { unmap(H); }
bool canCache(UNUSED uptr Size) { return false; }
void disable() {}
void enable() {}