12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Test that LargeAllocator unpoisons memory before releasing it to the OS. 22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan %s -o %t 32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// The memory is released only when the deallocated chunk leaves the quarantine, 42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// otherwise the mmap(p, ...) call overwrites the malloc header. 52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: ASAN_OPTIONS=quarantine_size=1 %run %t 62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <assert.h> 82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <string.h> 92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <sys/mman.h> 102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdlib.h> 112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef __ANDROID__ 132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <malloc.h> 142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid *my_memalign(size_t boundary, size_t size) { 152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return memalign(boundary, size); 162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid *my_memalign(size_t boundary, size_t size) { 192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void *p; 202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines posix_memalign(&p, boundary, size); 212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return p; 222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint main() { 262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines const int kPageSize = 4096; 272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void *p = my_memalign(kPageSize, 1024 * 1024); 282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines free(p); 292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *q = (char *)mmap(p, kPageSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, 0, 0); 312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(q == p); 322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines memset(q, 42, kPageSize); 342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines munmap(q, kPageSize); 362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return 0; 372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 38