Skip to content

Commit 0e4b214

Browse files
committed
[sanitizer_common] Don't try to unmap unaligned memory
Enabling `sanitizer_common` tests on Solaris (D91606 <https://reviews.llvm.org/D91606>) and SPARC (D91608 <https://reviews.llvm.org/D91608>) uncovered a sparcv9 failure SanitizerCommon-Unit :: ./Sanitizer-sparcv9-Test/CompactRingBuffer.int64 like this: [ RUN ] CompactRingBuffer.int64 ==24576==ERROR: SanitizerTool failed to deallocate 0x2000 (8192) bytes at address 0xffffffff7f59b000 ==24576==Sanitizer CHECK failed: /vol/llvm/src/llvm-project/local/compiler-rt/lib/sanitizer_common/sanitizer_posix.cpp:61 (("unable to unmap" && 0)) != (0) (0, 0) The problem is that the original allocation via `MmapAlignedOrDieOnFatalError` is for 4 kB, but the Solaris/sparcv9 pagesize is 8 kB. So the initial allocation is for 12 kB, rounded to a multiple of the pagesize. Afterwards, the unneeded rest is unmapped again, but this fails since the address is not pagesize-aligned. This patch avoids this by aligning the end of the mapping to the pagesize. With D91827 <https://reviews.llvm.org/D91827> added, the test `PASS`es on `sparcv9-sun-solaris2.11`. Differential Revision: https://reviews.llvm.org/D91615
1 parent 0d4b6f1 commit 0e4b214

File tree

1 file changed

+1
-0
lines changed

1 file changed

+1
-0
lines changed

compiler-rt/lib/sanitizer_common/sanitizer_posix.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ void *MmapAlignedOrDieOnFatalError(uptr size, uptr alignment,
9595
UnmapOrDie((void*)map_res, res - map_res);
9696
}
9797
uptr end = res + size;
98+
end = RoundUpTo(end, GetPageSizeCached());
9899
if (end != map_end)
99100
UnmapOrDie((void*)end, map_end - end);
100101
return (void*)res;

0 commit comments

Comments
 (0)