blob: 5284d9b5e63361af3513c8e4970d8a42ec827858 [file] [edit]
// Route OpenSSL allocations through the raw memory allocators.
// Shared by the _ssl and _hashlib modules.
#ifndef Py_OPENSSL_MEM_H
#define Py_OPENSSL_MEM_H
#include "Python.h"
#include <openssl/crypto.h> // CRYPTO_set_mem_functions()
// LibreSSL stubs out CRYPTO_set_mem_functions() and BoringSSL lacks it.
// AWS-LC has it, but unlike OpenSSL it does not refuse to install hooks
// after the first allocation, so earlier size-prefixed allocations would
// be freed with the wrong allocator.
#if !defined(LIBRESSL_VERSION_NUMBER) && !defined(OPENSSL_IS_BORINGSSL) \
&& !defined(OPENSSL_IS_AWSLC)
# define _Py_OPENSSL_CAN_SET_MEM_FUNCTIONS
#endif
#ifdef _Py_OPENSSL_CAN_SET_MEM_FUNCTIONS
static void *
_PyOpenSSL_Malloc(size_t size, const char *Py_UNUSED(file),
int Py_UNUSED(line))
{
return PyMem_RawMalloc(size);
}
static void *
_PyOpenSSL_Realloc(void *ptr, size_t size, const char *Py_UNUSED(file),
int Py_UNUSED(line))
{
return PyMem_RawRealloc(ptr, size);
}
static void
_PyOpenSSL_Free(void *ptr, const char *Py_UNUSED(file),
int Py_UNUSED(line))
{
PyMem_RawFree(ptr);
}
#endif // _Py_OPENSSL_CAN_SET_MEM_FUNCTIONS
static void
_PyOpenSSL_SetupMemFunctions(void)
{
#ifdef _Py_OPENSSL_CAN_SET_MEM_FUNCTIONS
// Fails if OpenSSL has already allocated memory (e.g. another
// libcrypto user in the process); it then keeps its current allocator.
(void)CRYPTO_set_mem_functions(_PyOpenSSL_Malloc, _PyOpenSSL_Realloc,
_PyOpenSSL_Free);
#endif
}
#endif // !Py_OPENSSL_MEM_H