Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbedtls by
memory_buffer_alloc.c
00001 /* 00002 * Buffer-based memory allocator 00003 * 00004 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved 00005 * SPDX-License-Identifier: Apache-2.0 00006 * 00007 * Licensed under the Apache License, Version 2.0 (the "License"); you may 00008 * not use this file except in compliance with the License. 00009 * You may obtain a copy of the License at 00010 * 00011 * http://www.apache.org/licenses/LICENSE-2.0 00012 * 00013 * Unless required by applicable law or agreed to in writing, software 00014 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 00015 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00016 * See the License for the specific language governing permissions and 00017 * limitations under the License. 00018 * 00019 * This file is part of mbed TLS (https://tls.mbed.org) 00020 */ 00021 00022 #if !defined(MBEDTLS_CONFIG_FILE) 00023 #include "mbedtls/config.h" 00024 #else 00025 #include MBEDTLS_CONFIG_FILE 00026 #endif 00027 00028 #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) 00029 #include "mbedtls/memory_buffer_alloc.h" 00030 00031 /* No need for the header guard as MBEDTLS_MEMORY_BUFFER_ALLOC_C 00032 is dependent upon MBEDTLS_PLATFORM_C */ 00033 #include "mbedtls/platform.h" 00034 00035 #include <string.h> 00036 00037 #if defined(MBEDTLS_MEMORY_BACKTRACE) 00038 #include <execinfo.h> 00039 #endif 00040 00041 #if defined(MBEDTLS_THREADING_C) 00042 #include "mbedtls/threading.h" 00043 #endif 00044 00045 /* Implementation that should never be optimized out by the compiler */ 00046 static void mbedtls_zeroize( void *v, size_t n ) { 00047 volatile unsigned char *p = v; while( n-- ) *p++ = 0; 00048 } 00049 00050 #define MAGIC1 0xFF00AA55 00051 #define MAGIC2 0xEE119966 00052 #define MAX_BT 20 00053 00054 typedef struct _memory_header memory_header; 00055 struct _memory_header 00056 { 00057 size_t magic1; 00058 size_t size; 00059 size_t alloc; 00060 memory_header *prev; 00061 memory_header *next; 00062 memory_header *prev_free; 00063 memory_header *next_free; 00064 #if defined(MBEDTLS_MEMORY_BACKTRACE) 00065 char **trace; 00066 size_t trace_count; 00067 #endif 00068 size_t magic2; 00069 }; 00070 00071 typedef struct 00072 { 00073 unsigned char *buf; 00074 size_t len; 00075 memory_header *first; 00076 memory_header *first_free; 00077 int verify; 00078 #if defined(MBEDTLS_MEMORY_DEBUG) 00079 size_t alloc_count; 00080 size_t free_count; 00081 size_t total_used; 00082 size_t maximum_used; 00083 size_t header_count; 00084 size_t maximum_header_count; 00085 #endif 00086 #if defined(MBEDTLS_THREADING_C) 00087 mbedtls_threading_mutex_t mutex; 00088 #endif 00089 } 00090 buffer_alloc_ctx; 00091 00092 static buffer_alloc_ctx heap; 00093 00094 #if defined(MBEDTLS_MEMORY_DEBUG) 00095 static void debug_header( memory_header *hdr ) 00096 { 00097 #if defined(MBEDTLS_MEMORY_BACKTRACE) 00098 size_t i; 00099 #endif 00100 00101 mbedtls_fprintf( stderr, "HDR: PTR(%10zu), PREV(%10zu), NEXT(%10zu), " 00102 "ALLOC(%zu), SIZE(%10zu)\n", 00103 (size_t) hdr, (size_t) hdr->prev, (size_t) hdr->next, 00104 hdr->alloc, hdr->size ); 00105 mbedtls_fprintf( stderr, " FPREV(%10zu), FNEXT(%10zu)\n", 00106 (size_t) hdr->prev_free, (size_t) hdr->next_free ); 00107 00108 #if defined(MBEDTLS_MEMORY_BACKTRACE) 00109 mbedtls_fprintf( stderr, "TRACE: \n" ); 00110 for( i = 0; i < hdr->trace_count; i++ ) 00111 mbedtls_fprintf( stderr, "%s\n", hdr->trace[i] ); 00112 mbedtls_fprintf( stderr, "\n" ); 00113 #endif 00114 } 00115 00116 static void debug_chain() 00117 { 00118 memory_header *cur = heap.first; 00119 00120 mbedtls_fprintf( stderr, "\nBlock list\n" ); 00121 while( cur != NULL ) 00122 { 00123 debug_header( cur ); 00124 cur = cur->next; 00125 } 00126 00127 mbedtls_fprintf( stderr, "Free list\n" ); 00128 cur = heap.first_free; 00129 00130 while( cur != NULL ) 00131 { 00132 debug_header( cur ); 00133 cur = cur->next_free; 00134 } 00135 } 00136 #endif /* MBEDTLS_MEMORY_DEBUG */ 00137 00138 static int verify_header( memory_header *hdr ) 00139 { 00140 if( hdr->magic1 != MAGIC1 ) 00141 { 00142 #if defined(MBEDTLS_MEMORY_DEBUG) 00143 mbedtls_fprintf( stderr, "FATAL: MAGIC1 mismatch\n" ); 00144 #endif 00145 return( 1 ); 00146 } 00147 00148 if( hdr->magic2 != MAGIC2 ) 00149 { 00150 #if defined(MBEDTLS_MEMORY_DEBUG) 00151 mbedtls_fprintf( stderr, "FATAL: MAGIC2 mismatch\n" ); 00152 #endif 00153 return( 1 ); 00154 } 00155 00156 if( hdr->alloc > 1 ) 00157 { 00158 #if defined(MBEDTLS_MEMORY_DEBUG) 00159 mbedtls_fprintf( stderr, "FATAL: alloc has illegal value\n" ); 00160 #endif 00161 return( 1 ); 00162 } 00163 00164 if( hdr->prev != NULL && hdr->prev == hdr->next ) 00165 { 00166 #if defined(MBEDTLS_MEMORY_DEBUG) 00167 mbedtls_fprintf( stderr, "FATAL: prev == next\n" ); 00168 #endif 00169 return( 1 ); 00170 } 00171 00172 if( hdr->prev_free != NULL && hdr->prev_free == hdr->next_free ) 00173 { 00174 #if defined(MBEDTLS_MEMORY_DEBUG) 00175 mbedtls_fprintf( stderr, "FATAL: prev_free == next_free\n" ); 00176 #endif 00177 return( 1 ); 00178 } 00179 00180 return( 0 ); 00181 } 00182 00183 static int verify_chain() 00184 { 00185 memory_header *prv = heap.first, *cur = heap.first->next; 00186 00187 if( verify_header( heap.first ) != 0 ) 00188 { 00189 #if defined(MBEDTLS_MEMORY_DEBUG) 00190 mbedtls_fprintf( stderr, "FATAL: verification of first header " 00191 "failed\n" ); 00192 #endif 00193 return( 1 ); 00194 } 00195 00196 if( heap.first->prev != NULL ) 00197 { 00198 #if defined(MBEDTLS_MEMORY_DEBUG) 00199 mbedtls_fprintf( stderr, "FATAL: verification failed: " 00200 "first->prev != NULL\n" ); 00201 #endif 00202 return( 1 ); 00203 } 00204 00205 while( cur != NULL ) 00206 { 00207 if( verify_header( cur ) != 0 ) 00208 { 00209 #if defined(MBEDTLS_MEMORY_DEBUG) 00210 mbedtls_fprintf( stderr, "FATAL: verification of header " 00211 "failed\n" ); 00212 #endif 00213 return( 1 ); 00214 } 00215 00216 if( cur->prev != prv ) 00217 { 00218 #if defined(MBEDTLS_MEMORY_DEBUG) 00219 mbedtls_fprintf( stderr, "FATAL: verification failed: " 00220 "cur->prev != prv\n" ); 00221 #endif 00222 return( 1 ); 00223 } 00224 00225 prv = cur; 00226 cur = cur->next; 00227 } 00228 00229 return( 0 ); 00230 } 00231 00232 static void *buffer_alloc_calloc( size_t n, size_t size ) 00233 { 00234 memory_header *new, *cur = heap.first_free; 00235 unsigned char *p; 00236 void *ret; 00237 size_t original_len, len; 00238 #if defined(MBEDTLS_MEMORY_BACKTRACE) 00239 void *trace_buffer[MAX_BT]; 00240 size_t trace_cnt; 00241 #endif 00242 00243 if( heap.buf == NULL || heap.first == NULL ) 00244 return( NULL ); 00245 00246 original_len = len = n * size; 00247 00248 if( n != 0 && len / n != size ) 00249 return( NULL ); 00250 00251 if( len % MBEDTLS_MEMORY_ALIGN_MULTIPLE ) 00252 { 00253 len -= len % MBEDTLS_MEMORY_ALIGN_MULTIPLE; 00254 len += MBEDTLS_MEMORY_ALIGN_MULTIPLE; 00255 } 00256 00257 // Find block that fits 00258 // 00259 while( cur != NULL ) 00260 { 00261 if( cur->size >= len ) 00262 break; 00263 00264 cur = cur->next_free; 00265 } 00266 00267 if( cur == NULL ) 00268 return( NULL ); 00269 00270 if( cur->alloc != 0 ) 00271 { 00272 #if defined(MBEDTLS_MEMORY_DEBUG) 00273 mbedtls_fprintf( stderr, "FATAL: block in free_list but allocated " 00274 "data\n" ); 00275 #endif 00276 mbedtls_exit( 1 ); 00277 } 00278 00279 #if defined(MBEDTLS_MEMORY_DEBUG) 00280 heap.alloc_count++; 00281 #endif 00282 00283 // Found location, split block if > memory_header + 4 room left 00284 // 00285 if( cur->size - len < sizeof(memory_header) + 00286 MBEDTLS_MEMORY_ALIGN_MULTIPLE ) 00287 { 00288 cur->alloc = 1; 00289 00290 // Remove from free_list 00291 // 00292 if( cur->prev_free != NULL ) 00293 cur->prev_free->next_free = cur->next_free; 00294 else 00295 heap.first_free = cur->next_free; 00296 00297 if( cur->next_free != NULL ) 00298 cur->next_free->prev_free = cur->prev_free; 00299 00300 cur->prev_free = NULL; 00301 cur->next_free = NULL; 00302 00303 #if defined(MBEDTLS_MEMORY_DEBUG) 00304 heap.total_used += cur->size; 00305 if( heap.total_used > heap.maximum_used ) 00306 heap.maximum_used = heap.total_used; 00307 #endif 00308 #if defined(MBEDTLS_MEMORY_BACKTRACE) 00309 trace_cnt = backtrace( trace_buffer, MAX_BT ); 00310 cur->trace = backtrace_symbols( trace_buffer, trace_cnt ); 00311 cur->trace_count = trace_cnt; 00312 #endif 00313 00314 if( ( heap.verify & MBEDTLS_MEMORY_VERIFY_ALLOC ) && verify_chain() != 0 ) 00315 mbedtls_exit( 1 ); 00316 00317 ret = (unsigned char *) cur + sizeof( memory_header ); 00318 memset( ret, 0, original_len ); 00319 00320 return( ret ); 00321 } 00322 00323 p = ( (unsigned char *) cur ) + sizeof(memory_header) + len; 00324 new = (memory_header *) p; 00325 00326 new->size = cur->size - len - sizeof(memory_header); 00327 new->alloc = 0; 00328 new->prev = cur; 00329 new->next = cur->next; 00330 #if defined(MBEDTLS_MEMORY_BACKTRACE) 00331 new->trace = NULL; 00332 new->trace_count = 0; 00333 #endif 00334 new->magic1 = MAGIC1; 00335 new->magic2 = MAGIC2; 00336 00337 if( new->next != NULL ) 00338 new->next->prev = new; 00339 00340 // Replace cur with new in free_list 00341 // 00342 new->prev_free = cur->prev_free; 00343 new->next_free = cur->next_free; 00344 if( new->prev_free != NULL ) 00345 new->prev_free->next_free = new; 00346 else 00347 heap.first_free = new; 00348 00349 if( new->next_free != NULL ) 00350 new->next_free->prev_free = new; 00351 00352 cur->alloc = 1; 00353 cur->size = len; 00354 cur->next = new; 00355 cur->prev_free = NULL; 00356 cur->next_free = NULL; 00357 00358 #if defined(MBEDTLS_MEMORY_DEBUG) 00359 heap.header_count++; 00360 if( heap.header_count > heap.maximum_header_count ) 00361 heap.maximum_header_count = heap.header_count; 00362 heap.total_used += cur->size; 00363 if( heap.total_used > heap.maximum_used ) 00364 heap.maximum_used = heap.total_used; 00365 #endif 00366 #if defined(MBEDTLS_MEMORY_BACKTRACE) 00367 trace_cnt = backtrace( trace_buffer, MAX_BT ); 00368 cur->trace = backtrace_symbols( trace_buffer, trace_cnt ); 00369 cur->trace_count = trace_cnt; 00370 #endif 00371 00372 if( ( heap.verify & MBEDTLS_MEMORY_VERIFY_ALLOC ) && verify_chain() != 0 ) 00373 mbedtls_exit( 1 ); 00374 00375 ret = (unsigned char *) cur + sizeof( memory_header ); 00376 memset( ret, 0, original_len ); 00377 00378 return( ret ); 00379 } 00380 00381 static void buffer_alloc_free( void *ptr ) 00382 { 00383 memory_header *hdr, *old = NULL; 00384 unsigned char *p = (unsigned char *) ptr; 00385 00386 if( ptr == NULL || heap.buf == NULL || heap.first == NULL ) 00387 return; 00388 00389 if( p < heap.buf || p > heap.buf + heap.len ) 00390 { 00391 #if defined(MBEDTLS_MEMORY_DEBUG) 00392 mbedtls_fprintf( stderr, "FATAL: mbedtls_free() outside of managed " 00393 "space\n" ); 00394 #endif 00395 mbedtls_exit( 1 ); 00396 } 00397 00398 p -= sizeof(memory_header); 00399 hdr = (memory_header *) p; 00400 00401 if( verify_header( hdr ) != 0 ) 00402 mbedtls_exit( 1 ); 00403 00404 if( hdr->alloc != 1 ) 00405 { 00406 #if defined(MBEDTLS_MEMORY_DEBUG) 00407 mbedtls_fprintf( stderr, "FATAL: mbedtls_free() on unallocated " 00408 "data\n" ); 00409 #endif 00410 mbedtls_exit( 1 ); 00411 } 00412 00413 hdr->alloc = 0; 00414 00415 #if defined(MBEDTLS_MEMORY_DEBUG) 00416 heap.free_count++; 00417 heap.total_used -= hdr->size; 00418 #endif 00419 00420 #if defined(MBEDTLS_MEMORY_BACKTRACE) 00421 free( hdr->trace ); 00422 hdr->trace = NULL; 00423 hdr->trace_count = 0; 00424 #endif 00425 00426 // Regroup with block before 00427 // 00428 if( hdr->prev != NULL && hdr->prev->alloc == 0 ) 00429 { 00430 #if defined(MBEDTLS_MEMORY_DEBUG) 00431 heap.header_count--; 00432 #endif 00433 hdr->prev->size += sizeof(memory_header) + hdr->size; 00434 hdr->prev->next = hdr->next; 00435 old = hdr; 00436 hdr = hdr->prev; 00437 00438 if( hdr->next != NULL ) 00439 hdr->next->prev = hdr; 00440 00441 memset( old, 0, sizeof(memory_header) ); 00442 } 00443 00444 // Regroup with block after 00445 // 00446 if( hdr->next != NULL && hdr->next->alloc == 0 ) 00447 { 00448 #if defined(MBEDTLS_MEMORY_DEBUG) 00449 heap.header_count--; 00450 #endif 00451 hdr->size += sizeof(memory_header) + hdr->next->size; 00452 old = hdr->next; 00453 hdr->next = hdr->next->next; 00454 00455 if( hdr->prev_free != NULL || hdr->next_free != NULL ) 00456 { 00457 if( hdr->prev_free != NULL ) 00458 hdr->prev_free->next_free = hdr->next_free; 00459 else 00460 heap.first_free = hdr->next_free; 00461 00462 if( hdr->next_free != NULL ) 00463 hdr->next_free->prev_free = hdr->prev_free; 00464 } 00465 00466 hdr->prev_free = old->prev_free; 00467 hdr->next_free = old->next_free; 00468 00469 if( hdr->prev_free != NULL ) 00470 hdr->prev_free->next_free = hdr; 00471 else 00472 heap.first_free = hdr; 00473 00474 if( hdr->next_free != NULL ) 00475 hdr->next_free->prev_free = hdr; 00476 00477 if( hdr->next != NULL ) 00478 hdr->next->prev = hdr; 00479 00480 memset( old, 0, sizeof(memory_header) ); 00481 } 00482 00483 // Prepend to free_list if we have not merged 00484 // (Does not have to stay in same order as prev / next list) 00485 // 00486 if( old == NULL ) 00487 { 00488 hdr->next_free = heap.first_free; 00489 if( heap.first_free != NULL ) 00490 heap.first_free->prev_free = hdr; 00491 heap.first_free = hdr; 00492 } 00493 00494 if( ( heap.verify & MBEDTLS_MEMORY_VERIFY_FREE ) && verify_chain() != 0 ) 00495 mbedtls_exit( 1 ); 00496 } 00497 00498 void mbedtls_memory_buffer_set_verify( int verify ) 00499 { 00500 heap.verify = verify; 00501 } 00502 00503 int mbedtls_memory_buffer_alloc_verify() 00504 { 00505 return verify_chain(); 00506 } 00507 00508 #if defined(MBEDTLS_MEMORY_DEBUG) 00509 void mbedtls_memory_buffer_alloc_status() 00510 { 00511 mbedtls_fprintf( stderr, 00512 "Current use: %zu blocks / %zu bytes, max: %zu blocks / " 00513 "%zu bytes (total %zu bytes), alloc / free: %zu / %zu\n", 00514 heap.header_count, heap.total_used, 00515 heap.maximum_header_count, heap.maximum_used, 00516 heap.maximum_header_count * sizeof( memory_header ) 00517 + heap.maximum_used, 00518 heap.alloc_count, heap.free_count ); 00519 00520 if( heap.first->next == NULL ) 00521 mbedtls_fprintf( stderr, "All memory de-allocated in stack buffer\n" ); 00522 else 00523 { 00524 mbedtls_fprintf( stderr, "Memory currently allocated:\n" ); 00525 debug_chain(); 00526 } 00527 } 00528 00529 void mbedtls_memory_buffer_alloc_max_get( size_t *max_used, size_t *max_blocks ) 00530 { 00531 *max_used = heap.maximum_used; 00532 *max_blocks = heap.maximum_header_count; 00533 } 00534 00535 void mbedtls_memory_buffer_alloc_max_reset( void ) 00536 { 00537 heap.maximum_used = 0; 00538 heap.maximum_header_count = 0; 00539 } 00540 00541 void mbedtls_memory_buffer_alloc_cur_get( size_t *cur_used, size_t *cur_blocks ) 00542 { 00543 *cur_used = heap.total_used; 00544 *cur_blocks = heap.header_count; 00545 } 00546 #endif /* MBEDTLS_MEMORY_DEBUG */ 00547 00548 #if defined(MBEDTLS_THREADING_C) 00549 static void *buffer_alloc_calloc_mutexed( size_t n, size_t size ) 00550 { 00551 void *buf; 00552 if( mbedtls_mutex_lock( &heap.mutex ) != 0 ) 00553 return( NULL ); 00554 buf = buffer_alloc_calloc( n, size ); 00555 if( mbedtls_mutex_unlock( &heap.mutex ) ) 00556 return( NULL ); 00557 return( buf ); 00558 } 00559 00560 static void buffer_alloc_free_mutexed( void *ptr ) 00561 { 00562 /* We have to good option here, but corrupting the heap seems 00563 * worse than loosing memory. */ 00564 if( mbedtls_mutex_lock( &heap.mutex ) ) 00565 return; 00566 buffer_alloc_free( ptr ); 00567 (void) mbedtls_mutex_unlock( &heap.mutex ); 00568 } 00569 #endif /* MBEDTLS_THREADING_C */ 00570 00571 void mbedtls_memory_buffer_alloc_init( unsigned char *buf, size_t len ) 00572 { 00573 memset( &heap, 0, sizeof(buffer_alloc_ctx) ); 00574 memset( buf, 0, len ); 00575 00576 #if defined(MBEDTLS_THREADING_C) 00577 mbedtls_mutex_init( &heap.mutex ); 00578 mbedtls_platform_set_calloc_free( buffer_alloc_calloc_mutexed, 00579 buffer_alloc_free_mutexed ); 00580 #else 00581 mbedtls_platform_set_calloc_free( buffer_alloc_calloc, buffer_alloc_free ); 00582 #endif 00583 00584 if( (size_t) buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE ) 00585 { 00586 /* Adjust len first since buf is used in the computation */ 00587 len -= MBEDTLS_MEMORY_ALIGN_MULTIPLE 00588 - (size_t) buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE; 00589 buf += MBEDTLS_MEMORY_ALIGN_MULTIPLE 00590 - (size_t) buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE; 00591 } 00592 00593 heap.buf = buf; 00594 heap.len = len; 00595 00596 heap.first = (memory_header *) buf; 00597 heap.first->size = len - sizeof(memory_header); 00598 heap.first->magic1 = MAGIC1; 00599 heap.first->magic2 = MAGIC2; 00600 heap.first_free = heap.first; 00601 } 00602 00603 void mbedtls_memory_buffer_alloc_free() 00604 { 00605 #if defined(MBEDTLS_THREADING_C) 00606 mbedtls_mutex_free( &heap.mutex ); 00607 #endif 00608 mbedtls_zeroize( &heap, sizeof(buffer_alloc_ctx) ); 00609 } 00610 00611 #if defined(MBEDTLS_SELF_TEST) 00612 static int check_pointer( void *p ) 00613 { 00614 if( p == NULL ) 00615 return( -1 ); 00616 00617 if( (size_t) p % MBEDTLS_MEMORY_ALIGN_MULTIPLE != 0 ) 00618 return( -1 ); 00619 00620 return( 0 ); 00621 } 00622 00623 static int check_all_free( ) 00624 { 00625 if( 00626 #if defined(MBEDTLS_MEMORY_DEBUG) 00627 heap.total_used != 0 || 00628 #endif 00629 heap.first != heap.first_free || 00630 (void *) heap.first != (void *) heap.buf ) 00631 { 00632 return( -1 ); 00633 } 00634 00635 return( 0 ); 00636 } 00637 00638 #define TEST_ASSERT( condition ) \ 00639 if( ! (condition) ) \ 00640 { \ 00641 if( verbose != 0 ) \ 00642 mbedtls_printf( "failed\n" ); \ 00643 \ 00644 ret = 1; \ 00645 goto cleanup; \ 00646 } 00647 00648 int mbedtls_memory_buffer_alloc_self_test( int verbose ) 00649 { 00650 unsigned char buf[1024]; 00651 unsigned char *p, *q, *r, *end; 00652 int ret = 0; 00653 00654 if( verbose != 0 ) 00655 mbedtls_printf( " MBA test #1 (basic alloc-free cycle): " ); 00656 00657 mbedtls_memory_buffer_alloc_init( buf, sizeof( buf ) ); 00658 00659 p = mbedtls_calloc( 1, 1 ); 00660 q = mbedtls_calloc( 1, 128 ); 00661 r = mbedtls_calloc( 1, 16 ); 00662 00663 TEST_ASSERT( check_pointer( p ) == 0 && 00664 check_pointer( q ) == 0 && 00665 check_pointer( r ) == 0 ); 00666 00667 mbedtls_free( r ); 00668 mbedtls_free( q ); 00669 mbedtls_free( p ); 00670 00671 TEST_ASSERT( check_all_free( ) == 0 ); 00672 00673 /* Memorize end to compare with the next test */ 00674 end = heap.buf + heap.len; 00675 00676 mbedtls_memory_buffer_alloc_free( ); 00677 00678 if( verbose != 0 ) 00679 mbedtls_printf( "passed\n" ); 00680 00681 if( verbose != 0 ) 00682 mbedtls_printf( " MBA test #2 (buf not aligned): " ); 00683 00684 mbedtls_memory_buffer_alloc_init( buf + 1, sizeof( buf ) - 1 ); 00685 00686 TEST_ASSERT( heap.buf + heap.len == end ); 00687 00688 p = mbedtls_calloc( 1, 1 ); 00689 q = mbedtls_calloc( 1, 128 ); 00690 r = mbedtls_calloc( 1, 16 ); 00691 00692 TEST_ASSERT( check_pointer( p ) == 0 && 00693 check_pointer( q ) == 0 && 00694 check_pointer( r ) == 0 ); 00695 00696 mbedtls_free( r ); 00697 mbedtls_free( q ); 00698 mbedtls_free( p ); 00699 00700 TEST_ASSERT( check_all_free( ) == 0 ); 00701 00702 mbedtls_memory_buffer_alloc_free( ); 00703 00704 if( verbose != 0 ) 00705 mbedtls_printf( "passed\n" ); 00706 00707 if( verbose != 0 ) 00708 mbedtls_printf( " MBA test #3 (full): " ); 00709 00710 mbedtls_memory_buffer_alloc_init( buf, sizeof( buf ) ); 00711 00712 p = mbedtls_calloc( 1, sizeof( buf ) - sizeof( memory_header ) ); 00713 00714 TEST_ASSERT( check_pointer( p ) == 0 ); 00715 TEST_ASSERT( mbedtls_calloc( 1, 1 ) == NULL ); 00716 00717 mbedtls_free( p ); 00718 00719 p = mbedtls_calloc( 1, sizeof( buf ) - 2 * sizeof( memory_header ) - 16 ); 00720 q = mbedtls_calloc( 1, 16 ); 00721 00722 TEST_ASSERT( check_pointer( p ) == 0 && check_pointer( q ) == 0 ); 00723 TEST_ASSERT( mbedtls_calloc( 1, 1 ) == NULL ); 00724 00725 mbedtls_free( q ); 00726 00727 TEST_ASSERT( mbedtls_calloc( 1, 17 ) == NULL ); 00728 00729 mbedtls_free( p ); 00730 00731 TEST_ASSERT( check_all_free( ) == 0 ); 00732 00733 mbedtls_memory_buffer_alloc_free( ); 00734 00735 if( verbose != 0 ) 00736 mbedtls_printf( "passed\n" ); 00737 00738 cleanup: 00739 mbedtls_memory_buffer_alloc_free( ); 00740 00741 return( ret ); 00742 } 00743 #endif /* MBEDTLS_SELF_TEST */ 00744 00745 #endif /* MBEDTLS_MEMORY_BUFFER_ALLOC_C */
Generated on Tue Jul 12 2022 17:25:42 by
1.7.2
