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