1 //===-- asan_activation.cc --------------------------------------*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file is a part of AddressSanitizer, an address sanity checker.
11 //
12 // ASan activation/deactivation logic.
13 //===----------------------------------------------------------------------===//
14
15 #include "asan_activation.h"
16 #include "asan_allocator.h"
17 #include "asan_flags.h"
18 #include "asan_internal.h"
19 #include "sanitizer_common/sanitizer_flags.h"
20
21 namespace __asan {
22
23 static struct AsanDeactivatedFlags {
24 int quarantine_size;
25 int max_redzone;
26 int malloc_context_size;
27 bool poison_heap;
28 } asan_deactivated_flags;
29
30 static bool asan_is_deactivated;
31
AsanStartDeactivated()32 void AsanStartDeactivated() {
33 VReport(1, "Deactivating ASan\n");
34 // Save flag values.
35 asan_deactivated_flags.quarantine_size = flags()->quarantine_size;
36 asan_deactivated_flags.max_redzone = flags()->max_redzone;
37 asan_deactivated_flags.poison_heap = flags()->poison_heap;
38 asan_deactivated_flags.malloc_context_size =
39 common_flags()->malloc_context_size;
40
41 flags()->quarantine_size = 0;
42 flags()->max_redzone = 16;
43 flags()->poison_heap = false;
44 common_flags()->malloc_context_size = 0;
45
46 asan_is_deactivated = true;
47 }
48
AsanActivate()49 void AsanActivate() {
50 if (!asan_is_deactivated) return;
51 VReport(1, "Activating ASan\n");
52
53 // Restore flag values.
54 // FIXME: this is not atomic, and there may be other threads alive.
55 flags()->quarantine_size = asan_deactivated_flags.quarantine_size;
56 flags()->max_redzone = asan_deactivated_flags.max_redzone;
57 flags()->poison_heap = asan_deactivated_flags.poison_heap;
58 common_flags()->malloc_context_size =
59 asan_deactivated_flags.malloc_context_size;
60
61 ParseExtraActivationFlags();
62
63 ReInitializeAllocator();
64
65 asan_is_deactivated = false;
66 VReport(
67 1,
68 "quarantine_size %d, max_redzone %d, poison_heap %d, malloc_context_size "
69 "%d\n",
70 flags()->quarantine_size, flags()->max_redzone, flags()->poison_heap,
71 common_flags()->malloc_context_size);
72 }
73
74 } // namespace __asan
75