[all-commits] [llvm/llvm-project] 1293e9: [Sanitizer] Fix page alignment for mmap calls
thetruestblue via All-commits
all-commits at lists.llvm.org
Thu Dec 22 10:27:01 PST 2022
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: 1293e93ee3da0d53665975499a909a45c5b90423
https://github.com/llvm/llvm-project/commit/1293e93ee3da0d53665975499a909a45c5b90423
Author: Blue Gaston <bgaston2 at apple.com>
Date: 2022-12-22 (Thu, 22 Dec 2022)
Changed paths:
M compiler-rt/lib/sanitizer_common/sanitizer_posix.cpp
Log Message:
-----------
[Sanitizer] Fix page alignment for mmap calls
We are in the process of enabling sanitizer_common unit tests on arm64 for apple devices. rdar://101436019
The test `CompactRingBuffer.int64` is failing on arm64 with the error:
```==17265==ERROR: SanitizerTool failed to deallocate 0xfffffffffffff000 (-4096) bytes at address 0x000105c30000
SanitizerTool: CHECK failed: sanitizer_posix.cpp:63 "(("unable to unmap" && 0)) != (0)" (0x0, 0x0) (tid=157296)```
If page size is sufficiently larger than alignment then this code:
UnmapOrDie((void*)end, map_end - end);
end is will be greater than map_end causing the value passed to UnmapOrDie to be negative.
This is caused when GetPageSizeCached returns 16k and alignment is 8k.
map_size and what is mapped by mmap uses size and alignment which is smaller than what is calculated by end using the actual page size.
Therefore, map_end ends up being less than end.
The call to mmap is allocating sufficent page-aligned memory, because it calls RoundUp within MmapOrDieOnFatalError.
But this size is not being captured by map_size.
We can address this by rounding up map_size here to be page-aligned. This ensures that map_end will be greater than or equal to end and that it will match mmaps use of page-aligned value, and the
subsequent call to munmap will also be page-aligned.
Differential Revision: https://reviews.llvm.org/D140353
More information about the All-commits
mailing list