1 /** 2 * \file memory_buffer_alloc.h 3 * 4 * \brief Buffer-based memory allocator 5 */ 6 /* 7 * Copyright The Mbed TLS Contributors 8 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 9 */ 10 #ifndef MBEDTLS_MEMORY_BUFFER_ALLOC_H 11 #define MBEDTLS_MEMORY_BUFFER_ALLOC_H 12 13 #include "mbedtls/build_info.h" 14 15 #include <stddef.h> 16 17 /** 18 * \name SECTION: Module settings 19 * 20 * The configuration options you can set for this module are in this section. 21 * Either change them in mbedtls_config.h or define them on the compiler command line. 22 * \{ 23 */ 24 25 #if !defined(MBEDTLS_MEMORY_ALIGN_MULTIPLE) 26 #define MBEDTLS_MEMORY_ALIGN_MULTIPLE 4 /**< Align on multiples of this value */ 27 #endif 28 29 /** \} name SECTION: Module settings */ 30 31 #define MBEDTLS_MEMORY_VERIFY_NONE 0 32 #define MBEDTLS_MEMORY_VERIFY_ALLOC (1 << 0) 33 #define MBEDTLS_MEMORY_VERIFY_FREE (1 << 1) 34 #define MBEDTLS_MEMORY_VERIFY_ALWAYS (MBEDTLS_MEMORY_VERIFY_ALLOC | \ 35 MBEDTLS_MEMORY_VERIFY_FREE) 36 37 #ifdef __cplusplus 38 extern "C" { 39 #endif 40 41 /** 42 * \brief Initialize use of stack-based memory allocator. 43 * The stack-based allocator does memory management inside the 44 * presented buffer and does not call calloc() and free(). 45 * It sets the global mbedtls_calloc() and mbedtls_free() pointers 46 * to its own functions. 47 * (Provided mbedtls_calloc() and mbedtls_free() are thread-safe if 48 * MBEDTLS_THREADING_C is defined) 49 * 50 * \note This code is not optimized and provides a straight-forward 51 * implementation of a stack-based memory allocator. 52 * 53 * \param buf buffer to use as heap 54 * \param len size of the buffer 55 */ 56 void mbedtls_memory_buffer_alloc_init(unsigned char *buf, size_t len); 57 58 /** 59 * \brief Free the mutex for thread-safety and clear remaining memory 60 */ 61 void mbedtls_memory_buffer_alloc_free(void); 62 63 /** 64 * \brief Determine when the allocator should automatically verify the state 65 * of the entire chain of headers / meta-data. 66 * (Default: MBEDTLS_MEMORY_VERIFY_NONE) 67 * 68 * \param verify One of MBEDTLS_MEMORY_VERIFY_NONE, MBEDTLS_MEMORY_VERIFY_ALLOC, 69 * MBEDTLS_MEMORY_VERIFY_FREE or MBEDTLS_MEMORY_VERIFY_ALWAYS 70 */ 71 void mbedtls_memory_buffer_set_verify(int verify); 72 73 #if defined(MBEDTLS_MEMORY_DEBUG) 74 /** 75 * \brief Print out the status of the allocated memory (primarily for use 76 * after a program should have de-allocated all memory) 77 * Prints out a list of 'still allocated' blocks and their stack 78 * trace if MBEDTLS_MEMORY_BACKTRACE is defined. 79 */ 80 void mbedtls_memory_buffer_alloc_status(void); 81 82 /** 83 * \brief Get the number of alloc/free so far. 84 * 85 * \param alloc_count Number of allocations. 86 * \param free_count Number of frees. 87 */ 88 void mbedtls_memory_buffer_alloc_count_get(size_t *alloc_count, size_t *free_count); 89 90 /** 91 * \brief Get the peak heap usage so far 92 * 93 * \param max_used Peak number of bytes in use or committed. This 94 * includes bytes in allocated blocks too small to split 95 * into smaller blocks but larger than the requested size. 96 * \param max_blocks Peak number of blocks in use, including free and used 97 */ 98 void mbedtls_memory_buffer_alloc_max_get(size_t *max_used, size_t *max_blocks); 99 100 /** 101 * \brief Reset peak statistics 102 */ 103 void mbedtls_memory_buffer_alloc_max_reset(void); 104 105 /** 106 * \brief Get the current heap usage 107 * 108 * \param cur_used Current number of bytes in use or committed. This 109 * includes bytes in allocated blocks too small to split 110 * into smaller blocks but larger than the requested size. 111 * \param cur_blocks Current number of blocks in use, including free and used 112 */ 113 void mbedtls_memory_buffer_alloc_cur_get(size_t *cur_used, size_t *cur_blocks); 114 #endif /* MBEDTLS_MEMORY_DEBUG */ 115 116 /** 117 * \brief Verifies that all headers in the memory buffer are correct 118 * and contain sane values. Helps debug buffer-overflow errors. 119 * 120 * Prints out first failure if MBEDTLS_MEMORY_DEBUG is defined. 121 * Prints out full header information if MBEDTLS_MEMORY_DEBUG 122 * is defined. (Includes stack trace information for each block if 123 * MBEDTLS_MEMORY_BACKTRACE is defined as well). 124 * 125 * \return 0 if verified, 1 otherwise 126 */ 127 int mbedtls_memory_buffer_alloc_verify(void); 128 129 #if defined(MBEDTLS_SELF_TEST) 130 /** 131 * \brief Checkup routine 132 * 133 * \return 0 if successful, or 1 if a test failed 134 */ 135 int mbedtls_memory_buffer_alloc_self_test(int verbose); 136 #endif 137 138 #ifdef __cplusplus 139 } 140 #endif 141 142 #endif /* memory_buffer_alloc.h */ 143