Branch data Line data Source code
1 : : // Copyright (c) 2009-2010 Satoshi Nakamoto
2 : : // Copyright (c) 2009-2022 The Bitcoin Core developers
3 : : // Distributed under the MIT software license, see the accompanying
4 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 : :
6 : : #ifndef BITCOIN_SUPPORT_ALLOCATORS_ZEROAFTERFREE_H
7 : : #define BITCOIN_SUPPORT_ALLOCATORS_ZEROAFTERFREE_H
8 : :
9 : : #include <support/cleanse.h>
10 : :
11 : : #include <memory>
12 : : #include <vector>
13 : :
14 : : template <typename T>
15 : : struct zero_after_free_allocator {
16 : : using value_type = T;
17 : :
18 : : zero_after_free_allocator() noexcept = default;
19 : : template <typename U>
20 : : zero_after_free_allocator(const zero_after_free_allocator<U>&) noexcept
21 : : {
22 : : }
23 : :
24 [ - + ]: 9808893 : T* allocate(std::size_t n)
25 : : {
26 [ - + ]: 9808893 : return std::allocator<T>{}.allocate(n);
27 : : }
28 : :
29 : 9808893 : void deallocate(T* p, std::size_t n)
30 : : {
31 [ + - ]: 9808893 : if (p != nullptr)
32 : 9808893 : memory_cleanse(p, sizeof(T) * n);
33 : 9808893 : std::allocator<T>{}.deallocate(p, n);
34 : 9808893 : }
35 : :
36 : : template <typename U>
37 : : friend bool operator==(const zero_after_free_allocator&, const zero_after_free_allocator<U>&) noexcept
38 : : {
39 : : return true;
40 : : }
41 : : template <typename U>
42 : : friend bool operator!=(const zero_after_free_allocator&, const zero_after_free_allocator<U>&) noexcept
43 : : {
44 : : return false;
45 : : }
46 : : };
47 : :
48 : : /** Byte-vector that clears its contents before deletion. */
49 : : using SerializeData = std::vector<std::byte, zero_after_free_allocator<std::byte>>;
50 : :
51 : : #endif // BITCOIN_SUPPORT_ALLOCATORS_ZEROAFTERFREE_H
|