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