45 lines · cpp
1// RUN: %clangxx_hwasan -O0 %s -o %t2// RUN: %env_hwasan_opts=allocator_may_return_null=0 not %run %t m1 2>&1 | FileCheck %s3// RUN: %env_hwasan_opts=allocator_may_return_null=1 %run %t m1 2>&1 | FileCheck %s --check-prefix=CHECK-NULL4// RUN: %env_hwasan_opts=allocator_may_return_null=0 not %run %t psm1 2>&1 | FileCheck %s5// RUN: %env_hwasan_opts=allocator_may_return_null=1 %run %t psm1 2>&1 | FileCheck %s --check-prefix=CHECK-NULL6 7// UNSUPPORTED: android8 9// Checks that pvalloc overflows are caught. If the allocator is allowed to10// 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(action, "m1")) {27 p = pvalloc((uintptr_t)-1);28 } else if (!strcmp(action, "psm1")) {29 p = pvalloc((uintptr_t)-(page_size - 1));30 } else {31 assert(0);32 }33 34 fprintf(stderr, "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 main43 44// CHECK-NULL: errno: 1245