memory_buffer_alloc.h 4.6 KB

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