1 // Copyright 2022 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "partition_alloc/dangling_raw_ptr_checks.h"
6 
7 #include "partition_alloc/partition_alloc_base/component_export.h"
8 #include "partition_alloc/partition_alloc_check.h"
9 
10 namespace partition_alloc {
11 
12 namespace {
__anon4af652940202(uintptr_t) 13 DanglingRawPtrDetectedFn* g_dangling_raw_ptr_detected_fn = [](uintptr_t) {};
__anon4af652940302(uintptr_t) 14 DanglingRawPtrReleasedFn* g_dangling_raw_ptr_released_fn = [](uintptr_t) {};
15 DanglingRawPtrDetectedFn* g_unretained_dangling_raw_ptr_detected_fn =
__anon4af652940402(uintptr_t) 16     [](uintptr_t) {};
17 bool g_unretained_dangling_raw_ptr_check_enabled = false;
18 }  // namespace
19 
GetDanglingRawPtrDetectedFn()20 DanglingRawPtrDetectedFn* GetDanglingRawPtrDetectedFn() {
21   PA_DCHECK(g_dangling_raw_ptr_detected_fn);
22   return g_dangling_raw_ptr_detected_fn;
23 }
24 
GetDanglingRawPtrReleasedFn()25 DanglingRawPtrDetectedFn* GetDanglingRawPtrReleasedFn() {
26   PA_DCHECK(g_dangling_raw_ptr_released_fn);
27   return g_dangling_raw_ptr_released_fn;
28 }
29 
SetDanglingRawPtrDetectedFn(DanglingRawPtrDetectedFn fn)30 void SetDanglingRawPtrDetectedFn(DanglingRawPtrDetectedFn fn) {
31   PA_DCHECK(fn);
32   g_dangling_raw_ptr_detected_fn = fn;
33 }
34 
SetDanglingRawPtrReleasedFn(DanglingRawPtrReleasedFn fn)35 void SetDanglingRawPtrReleasedFn(DanglingRawPtrReleasedFn fn) {
36   PA_DCHECK(fn);
37   g_dangling_raw_ptr_released_fn = fn;
38 }
39 
GetUnretainedDanglingRawPtrDetectedFn()40 DanglingRawPtrDetectedFn* GetUnretainedDanglingRawPtrDetectedFn() {
41   return g_unretained_dangling_raw_ptr_detected_fn;
42 }
43 
SetUnretainedDanglingRawPtrDetectedFn(DanglingRawPtrDetectedFn * fn)44 void SetUnretainedDanglingRawPtrDetectedFn(DanglingRawPtrDetectedFn* fn) {
45   PA_DCHECK(fn);
46   g_unretained_dangling_raw_ptr_detected_fn = fn;
47 }
48 
SetUnretainedDanglingRawPtrCheckEnabled(bool enabled)49 bool SetUnretainedDanglingRawPtrCheckEnabled(bool enabled) {
50   bool old = g_unretained_dangling_raw_ptr_check_enabled;
51   g_unretained_dangling_raw_ptr_check_enabled = enabled;
52   return old;
53 }
54 
55 namespace internal {
56 
PA_COMPONENT_EXPORT(PARTITION_ALLOC)57 PA_COMPONENT_EXPORT(PARTITION_ALLOC) void DanglingRawPtrDetected(uintptr_t id) {
58   g_dangling_raw_ptr_detected_fn(id);
59 }
PA_COMPONENT_EXPORT(PARTITION_ALLOC)60 PA_COMPONENT_EXPORT(PARTITION_ALLOC) void DanglingRawPtrReleased(uintptr_t id) {
61   g_dangling_raw_ptr_released_fn(id);
62 }
63 
PA_COMPONENT_EXPORT(PARTITION_ALLOC)64 PA_COMPONENT_EXPORT(PARTITION_ALLOC)
65 void UnretainedDanglingRawPtrDetected(uintptr_t id) {
66   g_unretained_dangling_raw_ptr_detected_fn(id);
67 }
68 
PA_COMPONENT_EXPORT(PARTITION_ALLOC)69 PA_COMPONENT_EXPORT(PARTITION_ALLOC)
70 bool IsUnretainedDanglingRawPtrCheckEnabled() {
71   return g_unretained_dangling_raw_ptr_check_enabled;
72 }
73 
74 }  // namespace internal
75 }  // namespace partition_alloc
76