diff options
Diffstat (limited to 'test/sanitizer_common/TestCases/Linux/pvalloc-overflow.cc')
-rw-r--r-- | test/sanitizer_common/TestCases/Linux/pvalloc-overflow.cc | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/test/sanitizer_common/TestCases/Linux/pvalloc-overflow.cc b/test/sanitizer_common/TestCases/Linux/pvalloc-overflow.cc new file mode 100644 index 000000000000..537c57e1a69f --- /dev/null +++ b/test/sanitizer_common/TestCases/Linux/pvalloc-overflow.cc @@ -0,0 +1,47 @@ +// 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, 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 <stdio.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); + } + // CHECK: {{ERROR: .*Sanitizer: pvalloc parameters overflow: size .* rounded up to system page size .* cannot be represented in type size_t}} + // CHECK: {{#0 .*pvalloc}} + // CHECK: {{#1 .*main .*pvalloc-overflow.cc:}} + // CHECK: {{SUMMARY: .*Sanitizer: pvalloc-overflow}} + + // The NULL pointer is printed differently on different systems, while (long)0 + // is always the same. + fprintf(stderr, "errno: %d, p: %lx\n", errno, (long)p); + // CHECK-NULL: errno: 12, p: 0 + + return 0; +} |