Summary: The local and global quarantine sizes were not offering a distinction for 32-bit and 64-bit platforms. This is addressed with lower values for 32-bit. When writing additional tests for the quarantine, it was discovered that when calling some of the allocator interface function prior to any allocation operation having occured, the test would crash due to the allocator not being initialized. This was addressed by making sure the allocator is initialized for those scenarios. Relevant tests were added in interface.cpp and quarantine.cpp. Last change being the removal of the extraneous link dependencies for the tests thanks to rL293220, anf the addition of the gc-sections linker flag. Reviewers: kcc, alekseyshl Reviewed By: alekseyshl Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D29341 llvm-svn: 294037
55 lines
1.6 KiB
C++
55 lines
1.6 KiB
C++
// RUN: %clang_scudo %s -o %t
|
|
// RUN: SCUDO_OPTIONS=allocator_may_return_null=0 not %run %t malloc 2>&1 | FileCheck %s
|
|
// RUN: SCUDO_OPTIONS=allocator_may_return_null=1 %run %t malloc 2>&1
|
|
// RUN: SCUDO_OPTIONS=allocator_may_return_null=0 not %run %t calloc 2>&1 | FileCheck %s
|
|
// RUN: SCUDO_OPTIONS=allocator_may_return_null=1 %run %t calloc 2>&1
|
|
// RUN: %run %t usable 2>&1
|
|
|
|
// Tests for various edge cases related to sizes, notably the maximum size the
|
|
// allocator can allocate. Tests that an integer overflow in the parameters of
|
|
// calloc is caught.
|
|
|
|
#include <assert.h>
|
|
#include <malloc.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include <limits>
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
assert(argc == 2);
|
|
if (!strcmp(argv[1], "malloc")) {
|
|
// Currently the maximum size the allocator can allocate is 1ULL<<40 bytes.
|
|
size_t size = std::numeric_limits<size_t>::max();
|
|
void *p = malloc(size);
|
|
assert(!p);
|
|
size = (1ULL << 40) - 16;
|
|
p = malloc(size);
|
|
assert(!p);
|
|
}
|
|
if (!strcmp(argv[1], "calloc")) {
|
|
// Trigger an overflow in calloc.
|
|
size_t size = std::numeric_limits<size_t>::max();
|
|
void *p = calloc((size / 0x1000) + 1, 0x1000);
|
|
assert(!p);
|
|
}
|
|
if (!strcmp(argv[1], "usable")) {
|
|
// Playing with the actual usable size of a chunk.
|
|
void *p = malloc(1007);
|
|
assert(p);
|
|
size_t size = malloc_usable_size(p);
|
|
assert(size >= 1007);
|
|
memset(p, 'A', size);
|
|
p = realloc(p, 2014);
|
|
assert(p);
|
|
size = malloc_usable_size(p);
|
|
assert(size >= 2014);
|
|
memset(p, 'B', size);
|
|
free(p);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// CHECK: allocator is terminating the process
|