@@ -1044,6 +1044,7 @@ class Allocator {
1044
1044
atomic_u32 DeallocationTid;
1045
1045
};
1046
1046
1047
+ MemMapT MemMap;
1047
1048
atomic_uptr Pos;
1048
1049
u32 Size;
1049
1050
// An array of Size (at least one) elements of type Entry is immediately
@@ -1492,12 +1493,15 @@ class Allocator {
1492
1493
static_cast <u32 >(getFlags ()->allocation_ring_buffer_size );
1493
1494
if (AllocationRingBufferSize < 1 )
1494
1495
return ;
1495
- RawRingBuffer = static_cast <char *>(
1496
- map (/* Addr=*/ nullptr ,
1497
- roundUp (ringBufferSizeInBytes (AllocationRingBufferSize),
1498
- getPageSizeCached ()),
1499
- " scudo:ring_buffer" ));
1496
+ MemMapT MemMap;
1497
+ MemMap.map (
1498
+ /* Addr=*/ 0U ,
1499
+ roundUp (ringBufferSizeInBytes (AllocationRingBufferSize),
1500
+ getPageSizeCached ()),
1501
+ " scudo:ring_buffer" );
1502
+ RawRingBuffer = reinterpret_cast <char *>(MemMap.getBase ());
1500
1503
auto *RingBuffer = reinterpret_cast <AllocationRingBuffer *>(RawRingBuffer);
1504
+ RingBuffer->MemMap = MemMap;
1501
1505
RingBuffer->Size = AllocationRingBufferSize;
1502
1506
static_assert (sizeof (AllocationRingBuffer) %
1503
1507
alignof (typename AllocationRingBuffer::Entry) ==
@@ -1506,7 +1510,11 @@ class Allocator {
1506
1510
}
1507
1511
1508
1512
void unmapRingBuffer () {
1509
- unmap (RawRingBuffer, roundUp (getRingBufferSize (), getPageSizeCached ()));
1513
+ auto *RingBuffer = getRingBuffer ();
1514
+ if (RingBuffer != nullptr ) {
1515
+ MemMapT MemMap = RingBuffer->MemMap ;
1516
+ MemMap.unmap (MemMap.getBase (), MemMap.getCapacity ());
1517
+ }
1510
1518
RawRingBuffer = nullptr ;
1511
1519
}
1512
1520
0 commit comments