| // 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 |