Botan 3.7.1
Crypto and TLS for C&
locking_allocator.cpp
Go to the documentation of this file.
1/*
2* Mlock Allocator
3* (C) 2012,2014,2015 Jack Lloyd
4*
5* Botan is released under the Simplified BSD License (see license.txt)
6*/
7
8#include <botan/internal/locking_allocator.h>
9
10#include <botan/compiler.h>
11#include <botan/internal/int_utils.h>
12#include <botan/internal/mem_pool.h>
13#include <botan/internal/os_utils.h>
14
15namespace Botan {
16
17void* mlock_allocator::allocate(size_t num_elems, size_t elem_size) {
18 if(!m_pool) {
19 return nullptr;
20 }
21
22 if(auto n = checked_mul(num_elems, elem_size)) {
23 return m_pool->allocate(n.value());
24 } else {
25 // overflow!
26 return nullptr;
27 }
28}
29
30bool mlock_allocator::deallocate(void* p, size_t num_elems, size_t elem_size) noexcept {
31 if(!m_pool) {
32 return false;
33 }
34
35 if(auto n = checked_mul(num_elems, elem_size)) {
36 return m_pool->deallocate(p, n.value());
37 } else {
38 /*
39 We return nullptr in allocate if there was an overflow, so if an
40 overflow occurs here we know the pointer was not allocated by this pool.
41 */
42 return false;
43 }
44}
45
47 const size_t mem_to_lock = OS::get_memory_locking_limit();
48 const size_t page_size = OS::system_page_size();
49
50 if(mem_to_lock > 0 && mem_to_lock % page_size == 0) {
51 m_locked_pages = OS::allocate_locked_pages(mem_to_lock / page_size);
52
53 if(!m_locked_pages.empty()) {
54 m_pool = std::make_unique<Memory_Pool>(m_locked_pages, page_size);
55 }
56 }
57}
58
60 if(m_pool) {
61 m_pool.reset();
62 // OS::free_locked_pages scrubs the memory before free
63 OS::free_locked_pages(m_locked_pages);
64 }
65}
66
67namespace {
68
69// NOLINTNEXTLINE(*-avoid-non-const-global-variables)
70BOTAN_EARLY_INIT(101) mlock_allocator g_mlock_allocator;
71
72} // namespace
73
75 return g_mlock_allocator;
76}
77
78} // namespace Botan
bool deallocate(void *p, size_t num_elems, size_t elem_size) noexcept
void * allocate(size_t num_elems, size_t elem_size)
#define BOTAN_EARLY_INIT(prio)
Definition compiler.h:56
size_t get_memory_locking_limit()
Definition os_utils.cpp:382
std::vector< void * > allocate_locked_pages(size_t count)
Definition os_utils.cpp:516
size_t system_page_size()
Definition os_utils.cpp:362
void free_locked_pages(const std::vector< void * > &pages)
Definition os_utils.cpp:635
constexpr std::optional< T > checked_mul(T a, T b)
Definition int_utils.h:46