[compiler-rt] r334424 - [Sanitizers] Move pvalloc overflow tests to common.

Alex Shlyapnikov via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 11 10:33:53 PDT 2018


Author: alekseyshl
Date: Mon Jun 11 10:33:53 2018
New Revision: 334424

URL: http://llvm.org/viewvc/llvm-project?rev=334424&view=rev
Log:
[Sanitizers] Move pvalloc overflow tests to common.

Summary:
Now all sanitizers with improved allocator error reporting are covered
by these common tests.

Also, add pvalloc-specific checks to LSan.

HWASan is not covered by sanitizer_common, hence its own pvalloc
and other allocator tests.

Reviewers: vitalybuka

Subscribers: srhines, kubamracek, delcypher, #sanitizers, llvm-commits

Differential Revision: https://reviews.llvm.org/D47970

Added:
    compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/pvalloc-overflow.cc
Removed:
    compiler-rt/trunk/test/asan/TestCases/Linux/pvalloc-overflow.cc
    compiler-rt/trunk/test/msan/pvalloc.cc
Modified:
    compiler-rt/trunk/lib/lsan/lsan_allocator.cc
    compiler-rt/trunk/lib/lsan/lsan_allocator.h
    compiler-rt/trunk/lib/lsan/lsan_interceptors.cc

Modified: compiler-rt/trunk/lib/lsan/lsan_allocator.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_allocator.cc?rev=334424&r1=334423&r2=334424&view=diff
==============================================================================
--- compiler-rt/trunk/lib/lsan/lsan_allocator.cc (original)
+++ compiler-rt/trunk/lib/lsan/lsan_allocator.cc Mon Jun 11 10:33:53 2018
@@ -198,6 +198,19 @@ void *lsan_valloc(uptr size, const Stack
       Allocate(stack, size, GetPageSizeCached(), kAlwaysClearMemory));
 }
 
+void *lsan_pvalloc(uptr size, const StackTrace &stack) {
+  uptr PageSize = GetPageSizeCached();
+  if (UNLIKELY(CheckForPvallocOverflow(size, PageSize))) {
+    errno = errno_ENOMEM;
+    if (AllocatorMayReturnNull())
+      return nullptr;
+    ReportPvallocOverflow(size, &stack);
+  }
+  // pvalloc(0) should allocate one page.
+  size = size ? RoundUpTo(size, PageSize) : PageSize;
+  return SetErrnoOnNull(Allocate(stack, size, PageSize, kAlwaysClearMemory));
+}
+
 uptr lsan_mz_size(const void *p) {
   return GetMallocUsableSize(p);
 }

Modified: compiler-rt/trunk/lib/lsan/lsan_allocator.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_allocator.h?rev=334424&r1=334423&r2=334424&view=diff
==============================================================================
--- compiler-rt/trunk/lib/lsan/lsan_allocator.h (original)
+++ compiler-rt/trunk/lib/lsan/lsan_allocator.h Mon Jun 11 10:33:53 2018
@@ -99,6 +99,7 @@ void lsan_free(void *p);
 void *lsan_realloc(void *p, uptr size, const StackTrace &stack);
 void *lsan_calloc(uptr nmemb, uptr size, const StackTrace &stack);
 void *lsan_valloc(uptr size, const StackTrace &stack);
+void *lsan_pvalloc(uptr size, const StackTrace &stack);
 uptr lsan_mz_size(const void *p);
 
 }  // namespace __lsan

Modified: compiler-rt/trunk/lib/lsan/lsan_interceptors.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_interceptors.cc?rev=334424&r1=334423&r2=334424&view=diff
==============================================================================
--- compiler-rt/trunk/lib/lsan/lsan_interceptors.cc (original)
+++ compiler-rt/trunk/lib/lsan/lsan_interceptors.cc Mon Jun 11 10:33:53 2018
@@ -165,13 +165,7 @@ INTERCEPTOR(int, mallopt, int cmd, int v
 INTERCEPTOR(void*, pvalloc, uptr size) {
   ENSURE_LSAN_INITED;
   GET_STACK_TRACE_MALLOC;
-  uptr PageSize = GetPageSizeCached();
-  size = RoundUpTo(size, PageSize);
-  if (size == 0) {
-    // pvalloc(0) should allocate one page.
-    size = PageSize;
-  }
-  return Allocate(stack, size, GetPageSizeCached(), kAlwaysClearMemory);
+  return lsan_pvalloc(size, stack);
 }
 #define LSAN_MAYBE_INTERCEPT_PVALLOC INTERCEPT_FUNCTION(pvalloc)
 #else

Removed: compiler-rt/trunk/test/asan/TestCases/Linux/pvalloc-overflow.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Linux/pvalloc-overflow.cc?rev=334423&view=auto
==============================================================================
--- compiler-rt/trunk/test/asan/TestCases/Linux/pvalloc-overflow.cc (original)
+++ compiler-rt/trunk/test/asan/TestCases/Linux/pvalloc-overflow.cc (removed)
@@ -1,46 +0,0 @@
-// RUN: %clangxx_asan  %s -o %t
-// RUN: ASAN_OPTIONS=allocator_may_return_null=0 not %run %t m1 2>&1 | FileCheck %s
-// RUN: ASAN_OPTIONS=allocator_may_return_null=1     %run %t m1 2>&1
-// RUN: ASAN_OPTIONS=allocator_may_return_null=0 not %run %t psm1 2>&1 | FileCheck %s
-// RUN: ASAN_OPTIONS=allocator_may_return_null=1     %run %t psm1 2>&1
-
-// UNSUPPORTED: freebsd, android
-
-// REQUIRES: stable-runtime
-
-// Checks that pvalloc overflows are caught. If the allocator is allowed to
-// return null, the errno should be set to ENOMEM.
-
-#include <assert.h>
-#include <errno.h>
-#include <malloc.h>
-#include <stdint.h>
-#include <string.h>
-#include <unistd.h>
-
-int main(int argc, char *argv[]) {
-  void *p;
-  size_t page_size;
-
-  assert(argc == 2);
-
-  page_size = sysconf(_SC_PAGESIZE);
-
-  if (!strcmp(argv[1], "m1")) {
-    p = pvalloc((uintptr_t)-1);
-    assert(!p);
-    assert(errno == ENOMEM);
-  }
-  if (!strcmp(argv[1], "psm1")) {
-    p = pvalloc((uintptr_t)-(page_size - 1));
-    assert(!p);
-    assert(errno == ENOMEM);
-  }
-
-  return 0;
-}
-
-// CHECK: {{ERROR: AddressSanitizer: pvalloc parameters overflow: size .* rounded up to system page size .* cannot be represented in type size_t}}
-// CHECK: {{#0 0x.* in .*pvalloc}}
-// CHECK: {{#1 0x.* in main .*pvalloc-overflow.cc:}}
-// CHECK: SUMMARY: AddressSanitizer: pvalloc-overflow

Removed: compiler-rt/trunk/test/msan/pvalloc.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/msan/pvalloc.cc?rev=334423&view=auto
==============================================================================
--- compiler-rt/trunk/test/msan/pvalloc.cc (original)
+++ compiler-rt/trunk/test/msan/pvalloc.cc (removed)
@@ -1,46 +0,0 @@
-// RUN: %clangxx_msan -fsanitize-memory-track-origins -O0 -g %s -o %t
-// RUN: MSAN_OPTIONS=allocator_may_return_null=0 not %run %t m1 2>&1 | FileCheck %s
-// RUN: MSAN_OPTIONS=allocator_may_return_null=1     %run %t m1 2>&1
-// RUN: MSAN_OPTIONS=allocator_may_return_null=0 not %run %t psm1 2>&1 | FileCheck %s
-// RUN: MSAN_OPTIONS=allocator_may_return_null=1     %run %t psm1 2>&1
-
-// pvalloc is Linux only
-// UNSUPPORTED: win32, freebsd, netbsd
-
-// Checks that pvalloc overflows are caught. If the allocator is allowed to
-// return null, the errno should be set to ENOMEM.
-
-#include <assert.h>
-#include <errno.h>
-#include <malloc.h>
-#include <stdint.h>
-#include <string.h>
-#include <unistd.h>
-
-int main(int argc, char *argv[]) {
-  void *p;
-  size_t page_size;
-
-  assert(argc == 2);
-
-  page_size = sysconf(_SC_PAGESIZE);
-  // Check that the page size is a power of two.
-  assert((page_size & (page_size - 1)) == 0);
-
-  if (!strcmp(argv[1], "m1")) {
-    p = pvalloc((uintptr_t)-1);
-    assert(!p);
-    assert(errno == ENOMEM);
-  }
-  if (!strcmp(argv[1], "psm1")) {
-    p = pvalloc((uintptr_t)-(page_size - 1));
-    assert(!p);
-    assert(errno == ENOMEM);
-  }
-
-  return 0;
-}
-
-// CHECK: {{ERROR: MemorySanitizer: pvalloc parameters overflow: size .* rounded up to system page size .* cannot be represented in type size_t}}
-// CHECK: {{#0 0x.* in .*pvalloc}}
-// CHECK: SUMMARY: MemorySanitizer: pvalloc-overflow

Added: compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/pvalloc-overflow.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/pvalloc-overflow.cc?rev=334424&view=auto
==============================================================================
--- compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/pvalloc-overflow.cc (added)
+++ compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/pvalloc-overflow.cc Mon Jun 11 10:33:53 2018
@@ -0,0 +1,46 @@
+// RUN: %clangxx %collect_stack_traces -O0 %s -o %t
+// RUN: %env_tool_opts=allocator_may_return_null=0 not %run %t m1 2>&1 | FileCheck %s
+// RUN: %env_tool_opts=allocator_may_return_null=1     %run %t m1 2>&1 | FileCheck %s --check-prefix=CHECK-NULL
+// RUN: %env_tool_opts=allocator_may_return_null=0 not %run %t psm1 2>&1 | FileCheck %s
+// RUN: %env_tool_opts=allocator_may_return_null=1     %run %t psm1 2>&1 | FileCheck %s --check-prefix=CHECK-NULL
+
+// REQUIRES: stable-runtime
+
+// UNSUPPORTED: android, freebsd, netbsd, tsan, ubsan
+
+// Checks that pvalloc overflows are caught. If the allocator is allowed to
+// return null, the errno should be set to ENOMEM.
+
+#include <assert.h>
+#include <errno.h>
+#include <malloc.h>
+#include <stdint.h>
+#include <string.h>
+#include <unistd.h>
+
+int main(int argc, char *argv[]) {
+  assert(argc == 2);
+  const char *action = argv[1];
+
+  const size_t page_size = sysconf(_SC_PAGESIZE);
+
+  void *p = nullptr;
+  if (!strcmp(action, "m1")) {
+    p = pvalloc((uintptr_t)-1);
+  } else if (!strcmp(action, "psm1")) {
+    p = pvalloc((uintptr_t)-(page_size - 1));
+  } else {
+    assert(0);
+  }
+
+  fprintf(stderr, "errno: %d\n", errno);
+
+  return p != nullptr;
+}
+
+// CHECK: {{ERROR: .*Sanitizer: pvalloc parameters overflow: size .* rounded up to system page size .* cannot be represented in type size_t}}
+// CHECK: {{#0 0x.* in .*pvalloc}}
+// CHECK: {{#1 0x.* in main .*pvalloc-overflow.cc:}}
+// CHECK: {{SUMMARY: .*Sanitizer: pvalloc-overflow}}
+
+// CHECK-NULL: errno: 12




More information about the llvm-commits mailing list