1// Test that LargeAllocator unpoisons memory before releasing it to the OS.
2// RUN: %clangxx_asan %s -o %t
3// The memory is released only when the deallocated chunk leaves the quarantine,
4// otherwise the mmap(p, ...) call overwrites the malloc header.
5// RUN: ASAN_OPTIONS=quarantine_size=1 %run %t
6
7#include <assert.h>
8#include <string.h>
9#include <sys/mman.h>
10#include <stdlib.h>
11
12#ifdef __ANDROID__
13#include <malloc.h>
14void *my_memalign(size_t boundary, size_t size) {
15  return memalign(boundary, size);
16}
17#else
18void *my_memalign(size_t boundary, size_t size) {
19  void *p;
20  posix_memalign(&p, boundary, size);
21  return p;
22}
23#endif
24
25int main() {
26  const int kPageSize = 4096;
27  void *p = my_memalign(kPageSize, 1024 * 1024);
28  free(p);
29
30  char *q = (char *)mmap(p, kPageSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, 0, 0);
31  assert(q == p);
32
33  memset(q, 42, kPageSize);
34
35  munmap(q, kPageSize);
36  return 0;
37}
38