[PATCH] D79656: [hwasan] Fix allocator alignment.
Evgenii Stepanov via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri May 8 17:13:31 PDT 2020
eugenis created this revision.
eugenis added reviewers: pcc, hctim, cryptoad.
Herald added a project: Sanitizers.
Herald added a subscriber: Sanitizers.
Fix hwasan allocator not respecting the requested alignment when it is
higher than a page, but still within primary (i.e. [2048, 65536]).
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D79656
Files:
compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary64.h
compiler-rt/lib/sanitizer_common/sanitizer_common.cpp
compiler-rt/lib/sanitizer_common/sanitizer_common.h
compiler-rt/test/hwasan/TestCases/malloc-align.c
Index: compiler-rt/test/hwasan/TestCases/malloc-align.c
===================================================================
--- /dev/null
+++ compiler-rt/test/hwasan/TestCases/malloc-align.c
@@ -0,0 +1,37 @@
+// Test malloc alignment.
+// RUN: %clang_hwasan -mllvm -hwasan-globals=0 %s -o %t
+// RUN: %run %t
+
+#include <assert.h>
+#include <sanitizer/allocator_interface.h>
+#include <sanitizer/hwasan_interface.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+static const size_t sizes[] = {
+ 1, 3, 7, 8, 9, 16, 17, 31, 32, 33,
+ 63, 64, 65, 127, 128, 129, 511, 512, 513, 2047,
+ 2048, 2049, 65535, 65536, 65537, 1048575, 1048576, 1048577};
+static const size_t alignments[] = {8, 16, 64, 256, 1024, 4096, 65536, 131072};
+
+__attribute__((no_sanitize("hwaddress"))) int main() {
+ for (unsigned i = 0; i < sizeof(sizes) / sizeof(*sizes); ++i) {
+ for (unsigned j = 0; j < sizeof(alignments) / sizeof(*alignments); ++j) {
+ size_t size = sizes[i];
+ size_t alignment = alignments[j];
+ fprintf(stderr, "size %zu, alignment %zu (0x%zx)\n", size, alignment,
+ alignment);
+ const int cnt = 10;
+ void *ptrs[cnt];
+ for (int k = 0; k < cnt; ++k) {
+ int res = posix_memalign(&ptrs[k], alignment, size);
+ assert(res == 0);
+ fprintf(stderr, "... addr 0x%zx\n", (size_t)ptrs[k]);
+ assert(((size_t)ptrs[k] & (alignment - 1)) == 0);
+ }
+ for (int k = 0; k < cnt; ++k)
+ free(ptrs[k]);
+ }
+ }
+ return 0;
+}
Index: compiler-rt/lib/sanitizer_common/sanitizer_common.h
===================================================================
--- compiler-rt/lib/sanitizer_common/sanitizer_common.h
+++ compiler-rt/lib/sanitizer_common/sanitizer_common.h
@@ -143,6 +143,7 @@
class ReservedAddressRange {
public:
uptr Init(uptr size, const char *name = nullptr, uptr fixed_addr = 0);
+ uptr InitAligned(uptr size, uptr align, const char *name = nullptr);
uptr Map(uptr fixed_addr, uptr size, const char *name = nullptr);
uptr MapOrDie(uptr fixed_addr, uptr size, const char *name = nullptr);
void Unmap(uptr addr, uptr size);
Index: compiler-rt/lib/sanitizer_common/sanitizer_common.cpp
===================================================================
--- compiler-rt/lib/sanitizer_common/sanitizer_common.cpp
+++ compiler-rt/lib/sanitizer_common/sanitizer_common.cpp
@@ -323,6 +323,15 @@
return 0;
}
+uptr ReservedAddressRange::InitAligned(uptr size, uptr align,
+ const char *name) {
+ if (align <= GetPageSizeCached())
+ return Init(size, name);
+ uptr start = Init(size + align, name);
+ start += align - (start & (align - 1));
+ return start;
+}
+
} // namespace __sanitizer
using namespace __sanitizer;
Index: compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary64.h
===================================================================
--- compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary64.h
+++ compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary64.h
@@ -75,8 +75,8 @@
CHECK_EQ(kSpaceBeg, address_range.Init(TotalSpaceSize,
PrimaryAllocatorName, kSpaceBeg));
} else {
- NonConstSpaceBeg = address_range.Init(TotalSpaceSize,
- PrimaryAllocatorName);
+ NonConstSpaceBeg = address_range.InitAligned(
+ TotalSpaceSize, SizeClassMap::kMaxSize, PrimaryAllocatorName);
CHECK_NE(NonConstSpaceBeg, ~(uptr)0);
}
SetReleaseToOSIntervalMs(release_to_os_interval_ms);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D79656.262979.patch
Type: text/x-patch
Size: 3597 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200509/e0df51c7/attachment.bin>
More information about the llvm-commits
mailing list