Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
folium-app
GitHub Repository: folium-app/Folium
Path: blob/a-new-beginning/SharedDependencies/Sources/cryptopp/allocate.cpp
2 views
1
// allocate.cpp - written and placed in the public domain by Jeffrey Walton
2
3
// The functions in allocate.h and allocate.cpp were originally in misc.h
4
// and misc.cpp. They were extracted in September 2019 to sidestep a circular
5
// dependency with misc.h and secblock.h.
6
7
#include "pch.h"
8
#include "config.h"
9
10
#ifndef CRYPTOPP_IMPORTS
11
12
#include "allocate.h"
13
#include "stdcpp.h"
14
#include "misc.h"
15
#include "trap.h"
16
17
// for memalign
18
#if defined(CRYPTOPP_MEMALIGN_AVAILABLE) || defined(CRYPTOPP_MM_MALLOC_AVAILABLE) || defined(QNX)
19
# include <malloc.h>
20
#endif
21
// for posix_memalign
22
#if defined(CRYPTOPP_POSIX_MEMALIGN_AVAILABLE)
23
# include <stdlib.h>
24
#endif
25
26
NAMESPACE_BEGIN(CryptoPP)
27
28
void CallNewHandler()
29
{
30
std::new_handler newHandler = std::set_new_handler(NULLPTR);
31
if (newHandler)
32
std::set_new_handler(newHandler);
33
34
if (newHandler)
35
newHandler();
36
else
37
throw std::bad_alloc();
38
}
39
40
void * AlignedAllocate(size_t size)
41
{
42
byte *p;
43
#if defined(CRYPTOPP_MM_MALLOC_AVAILABLE)
44
while ((p = (byte *)_mm_malloc(size, 16)) == NULLPTR)
45
#elif defined(CRYPTOPP_MEMALIGN_AVAILABLE)
46
while ((p = (byte *)memalign(16, size)) == NULLPTR)
47
#elif defined(CRYPTOPP_MALLOC_ALIGNMENT_IS_16)
48
while ((p = (byte *)malloc(size)) == NULLPTR)
49
#elif defined(CRYPTOPP_POSIX_MEMALIGN_AVAILABLE)
50
while (posix_memalign(reinterpret_cast<void**>(&p), 16, size) != 0)
51
#else
52
while ((p = (byte *)malloc(size + 16)) == NULLPTR)
53
#endif
54
CallNewHandler();
55
56
#ifdef CRYPTOPP_NO_ALIGNED_ALLOC
57
size_t adjustment = 16-((size_t)p%16);
58
CRYPTOPP_ASSERT(adjustment > 0);
59
p += adjustment;
60
p[-1] = (byte)adjustment;
61
#endif
62
63
// If this assert fires then there are problems that need
64
// to be fixed. Please open a bug report.
65
CRYPTOPP_ASSERT(IsAlignedOn(p, 16));
66
return p;
67
}
68
69
void AlignedDeallocate(void *p)
70
{
71
// Guard pointer due to crash on AIX when CRYPTOPP_NO_ALIGNED_ALLOC
72
// is in effect. The guard was previously in place in SecBlock,
73
// but it was removed at f4d68353ca7c as part of GH #875.
74
CRYPTOPP_ASSERT(p);
75
76
if (p != NULLPTR)
77
{
78
#ifdef CRYPTOPP_MM_MALLOC_AVAILABLE
79
_mm_free(p);
80
#elif defined(CRYPTOPP_NO_ALIGNED_ALLOC)
81
p = (byte *)p - ((byte *)p)[-1];
82
free(p);
83
#else
84
free(p);
85
#endif
86
}
87
}
88
89
void * UnalignedAllocate(size_t size)
90
{
91
void *p;
92
while ((p = malloc(size)) == NULLPTR)
93
CallNewHandler();
94
return p;
95
}
96
97
void UnalignedDeallocate(void *p)
98
{
99
free(p);
100
}
101
102
NAMESPACE_END
103
104
#endif // CRYPTOPP_IMPORTS
105
106