1 // Copyright 2023 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/pointers/raw_ptr_hookable_impl.h"
6 
7 #include <atomic>
8 #include <cstdint>
9 
10 namespace base::internal {
11 
12 namespace {
13 
DefaultWrapPtrHook(uintptr_t address)14 void DefaultWrapPtrHook(uintptr_t address) {}
DefaultReleaseWrappedPtrHook(uintptr_t address)15 void DefaultReleaseWrappedPtrHook(uintptr_t address) {}
DefaultUnwrapForDereferenceHook(uintptr_t address)16 void DefaultUnwrapForDereferenceHook(uintptr_t address) {}
DefaultUnwrapForExtractionHook(uintptr_t address)17 void DefaultUnwrapForExtractionHook(uintptr_t address) {}
DefaultUnwrapForComparisonHook(uintptr_t address)18 void DefaultUnwrapForComparisonHook(uintptr_t address) {}
DefaultAdvanceHook(uintptr_t old_address,uintptr_t new_address)19 void DefaultAdvanceHook(uintptr_t old_address, uintptr_t new_address) {}
DefaultDuplicateHook(uintptr_t address)20 void DefaultDuplicateHook(uintptr_t address) {}
DefaultWrapPtrForDuplicationHook(uintptr_t address)21 void DefaultWrapPtrForDuplicationHook(uintptr_t address) {}
DefaultUnsafelyUnwrapForDuplicationHook(uintptr_t address)22 void DefaultUnsafelyUnwrapForDuplicationHook(uintptr_t address) {}
23 
24 constexpr RawPtrHooks default_hooks = {
25     DefaultWrapPtrHook,
26     DefaultReleaseWrappedPtrHook,
27     DefaultUnwrapForDereferenceHook,
28     DefaultUnwrapForExtractionHook,
29     DefaultUnwrapForComparisonHook,
30     DefaultAdvanceHook,
31     DefaultDuplicateHook,
32     DefaultWrapPtrForDuplicationHook,
33     DefaultUnsafelyUnwrapForDuplicationHook,
34 };
35 
36 }  // namespace
37 
38 std::atomic<const RawPtrHooks*> g_hooks{&default_hooks};
39 
GetRawPtrHooks()40 const RawPtrHooks* GetRawPtrHooks() {
41   return g_hooks.load(std::memory_order_relaxed);
42 }
43 
InstallRawPtrHooks(const RawPtrHooks * hooks)44 void InstallRawPtrHooks(const RawPtrHooks* hooks) {
45   g_hooks.store(hooks, std::memory_order_relaxed);
46 }
47 
ResetRawPtrHooks()48 void ResetRawPtrHooks() {
49   InstallRawPtrHooks(&default_hooks);
50 }
51 
52 }  // namespace base::internal
53