[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