1// RUN: %clangxx_hwasan -O0 %s -o %t
2// RUN: %env_hwasan_opts=allocator_may_return_null=0 not %run %t m1 2>&1 | FileCheck %s
3// RUN: %env_hwasan_opts=allocator_may_return_null=1 %run %t m1 2>&1 | FileCheck %s --check-prefix=CHECK-NULL
4// RUN: %env_hwasan_opts=allocator_may_return_null=0 not %run %t psm1 2>&1 | FileCheck %s
5// RUN: %env_hwasan_opts=allocator_may_return_null=1 %run %t psm1 2>&1 | FileCheck %s --check-prefix=CHECK-NULL
6
7// UNSUPPORTED: android
8
9// Checks that pvalloc overflows are caught. If the allocator is allowed to
10// return null, the errno should be set to ENOMEM.
11
12#include <assert.h>
13#include <errno.h>
14#include <malloc.h>
15#include <stdint.h>
16#include <string.h>
17#include <unistd.h>
18
19int main(int argc, char *argv[]) {
20 assert(argc == 2);
21 const char *action = argv[1];
22
23 const size_t page_size = sysconf(_SC_PAGESIZE);
24
25 void *p = nullptr;
26 if (!strcmp(s1: action, s2: "m1")) {
27 p = pvalloc(size: (uintptr_t)-1);
28 } else if (!strcmp(s1: action, s2: "psm1")) {
29 p = pvalloc(size: (uintptr_t)-(page_size - 1));
30 } else {
31 assert(0);
32 }
33
34 fprintf(stderr, format: "errno: %d\n", errno);
35
36 return p != nullptr;
37}
38
39// CHECK: {{ERROR: HWAddressSanitizer: pvalloc parameters overflow: size .* rounded up to system page size .* cannot be represented in type size_t}}
40// CHECK: {{#0 0x.* in .*pvalloc}}
41// CHECK: {{#1 0x.* in main .*pvalloc-overflow.cpp:}}
42// CHECK: SUMMARY: HWAddressSanitizer: pvalloc-overflow {{.*}} in main
43
44// CHECK-NULL: errno: 12
45

source code of compiler-rt/test/hwasan/TestCases/Linux/pvalloc-overflow.cpp