Botan 3.4.0
Crypto and TLS for C&
allocator.cpp
Go to the documentation of this file.
1/*
2* (C) 2017,2023 Jack Lloyd
3*
4* Botan is released under the Simplified BSD License (see license.txt)
5*/
6
7#include <botan/allocator.h>
8
9#include <botan/mem_ops.h>
10#include <botan/internal/safeint.h>
11#include <cstdlib>
12#include <new>
13
14#if defined(BOTAN_HAS_LOCKING_ALLOCATOR)
15 #include <botan/internal/locking_allocator.h>
16#endif
17
18namespace Botan {
19
20BOTAN_MALLOC_FN void* allocate_memory(size_t elems, size_t elem_size) {
21 if(elems == 0 || elem_size == 0) {
22 return nullptr;
23 }
24
25 // Some calloc implementations do not check for overflow (?!?)
26
27 if(!BOTAN_CHECKED_MUL(elems, elem_size).has_value()) {
28 throw std::bad_alloc();
29 }
30
31#if defined(BOTAN_HAS_LOCKING_ALLOCATOR)
32 if(void* p = mlock_allocator::instance().allocate(elems, elem_size)) {
33 return p;
34 }
35#endif
36
37#if defined(BOTAN_TARGET_OS_HAS_ALLOC_CONCEAL)
38 void* ptr = ::calloc_conceal(elems, elem_size);
39#else
40 void* ptr = std::calloc(elems, elem_size); // NOLINT(*-no-malloc)
41#endif
42 if(!ptr) {
43 [[unlikely]] throw std::bad_alloc();
44 }
45 return ptr;
46}
47
48void deallocate_memory(void* p, size_t elems, size_t elem_size) {
49 if(p == nullptr) {
50 [[unlikely]] return;
51 }
52
53 secure_scrub_memory(p, elems * elem_size);
54
55#if defined(BOTAN_HAS_LOCKING_ALLOCATOR)
56 if(mlock_allocator::instance().deallocate(p, elems, elem_size)) {
57 return;
58 }
59#endif
60
61 std::free(p); // NOLINT(*-no-malloc)
62}
63
65#if defined(BOTAN_HAS_LOCKING_ALLOCATOR)
67#endif
68}
69
70} // namespace Botan
static mlock_allocator & instance()
#define BOTAN_MALLOC_FN
Definition compiler.h:108
BOTAN_MALLOC_FN void * allocate_memory(size_t elems, size_t elem_size)
Definition allocator.cpp:20
void deallocate_memory(void *p, size_t elems, size_t elem_size)
Definition allocator.cpp:48
void secure_scrub_memory(void *ptr, size_t n)
Definition os_utils.cpp:87
void initialize_allocator()
Definition allocator.cpp:64
#define BOTAN_CHECKED_MUL(x, y)
Definition safeint.h:74