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 // Regroup with block before 00421 // 00422 if( hdr->prev != NULL && hdr->prev->alloc == 0 ) 00423 { 00424 #if defined(MBEDTLS_MEMORY_DEBUG) 00425 heap.header_count--; 00426 #endif 00427 hdr->prev->size += sizeof(memory_header) + hdr->size; 00428 hdr->prev->next = hdr->next; 00429 old = hdr; 00430 hdr = hdr->prev; 00431 00432 if( hdr->next != NULL ) 00433 hdr->next->prev = hdr; 00434 00435 #if defined(MBEDTLS_MEMORY_BACKTRACE) 00436 free( old->trace ); 00437 #endif 00438 memset( old, 0, sizeof(memory_header) ); 00439 } 00440 00441 // Regroup with block after 00442 // 00443 if( hdr->next != NULL && hdr->next->alloc == 0 ) 00444 { 00445 #if defined(MBEDTLS_MEMORY_DEBUG) 00446 heap.header_count--; 00447 #endif 00448 hdr->size += sizeof(memory_header) + hdr->next->size; 00449 old = hdr->next; 00450 hdr->next = hdr->next->next; 00451 00452 if( hdr->prev_free != NULL || hdr->next_free != NULL ) 00453 { 00454 if( hdr->prev_free != NULL ) 00455 hdr->prev_free->next_free = hdr->next_free; 00456 else 00457 heap.first_free = hdr->next_free; 00458 00459 if( hdr->next_free != NULL ) 00460 hdr->next_free->prev_free = hdr->prev_free; 00461 } 00462 00463 hdr->prev_free = old->prev_free; 00464 hdr->next_free = old->next_free; 00465 00466 if( hdr->prev_free != NULL ) 00467 hdr->prev_free->next_free = hdr; 00468 else 00469 heap.first_free = hdr; 00470 00471 if( hdr->next_free != NULL ) 00472 hdr->next_free->prev_free = hdr; 00473 00474 if( hdr->next != NULL ) 00475 hdr->next->prev = hdr; 00476 00477 #if defined(MBEDTLS_MEMORY_BACKTRACE) 00478 free( old->trace ); 00479 #endif 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 defined(MBEDTLS_MEMORY_BACKTRACE) 00495 hdr->trace = NULL; 00496 hdr->trace_count = 0; 00497 #endif 00498 00499 if( ( heap.verify & MBEDTLS_MEMORY_VERIFY_FREE ) && verify_chain() != 0 ) 00500 mbedtls_exit( 1 ); 00501 } 00502 00503 void mbedtls_memory_buffer_set_verify( int verify ) 00504 { 00505 heap.verify = verify; 00506 } 00507 00508 int mbedtls_memory_buffer_alloc_verify() 00509 { 00510 return verify_chain(); 00511 } 00512 00513 #if defined(MBEDTLS_MEMORY_DEBUG) 00514 void mbedtls_memory_buffer_alloc_status() 00515 { 00516 mbedtls_fprintf( stderr, 00517 "Current use: %zu blocks / %zu bytes, max: %zu blocks / " 00518 "%zu bytes (total %zu bytes), alloc / free: %zu / %zu\n", 00519 heap.header_count, heap.total_used, 00520 heap.maximum_header_count, heap.maximum_used, 00521 heap.maximum_header_count * sizeof( memory_header ) 00522 + heap.maximum_used, 00523 heap.alloc_count, heap.free_count ); 00524 00525 if( heap.first->next == NULL ) 00526 mbedtls_fprintf( stderr, "All memory de-allocated in stack buffer\n" ); 00527 else 00528 { 00529 mbedtls_fprintf( stderr, "Memory currently allocated:\n" ); 00530 debug_chain(); 00531 } 00532 } 00533 00534 void mbedtls_memory_buffer_alloc_max_get( size_t *max_used, size_t *max_blocks ) 00535 { 00536 *max_used = heap.maximum_used; 00537 *max_blocks = heap.maximum_header_count; 00538 } 00539 00540 void mbedtls_memory_buffer_alloc_max_reset( void ) 00541 { 00542 heap.maximum_used = 0; 00543 heap.maximum_header_count = 0; 00544 } 00545 00546 void mbedtls_memory_buffer_alloc_cur_get( size_t *cur_used, size_t *cur_blocks ) 00547 { 00548 *cur_used = heap.total_used; 00549 *cur_blocks = heap.header_count; 00550 } 00551 #endif /* MBEDTLS_MEMORY_DEBUG */ 00552 00553 #if defined(MBEDTLS_THREADING_C) 00554 static void *buffer_alloc_calloc_mutexed( size_t n, size_t size ) 00555 { 00556 void *buf; 00557 if( mbedtls_mutex_lock( &heap.mutex ) != 0 ) 00558 return( NULL ); 00559 buf = buffer_alloc_calloc( n, size ); 00560 if( mbedtls_mutex_unlock( &heap.mutex ) ) 00561 return( NULL ); 00562 return( buf ); 00563 } 00564 00565 static void buffer_alloc_free_mutexed( void *ptr ) 00566 { 00567 /* We have to good option here, but corrupting the heap seems 00568 * worse than loosing memory. */ 00569 if( mbedtls_mutex_lock( &heap.mutex ) ) 00570 return; 00571 buffer_alloc_free( ptr ); 00572 (void) mbedtls_mutex_unlock( &heap.mutex ); 00573 } 00574 #endif /* MBEDTLS_THREADING_C */ 00575 00576 void mbedtls_memory_buffer_alloc_init( unsigned char *buf, size_t len ) 00577 { 00578 memset( &heap, 0, sizeof(buffer_alloc_ctx) ); 00579 memset( buf, 0, len ); 00580 00581 #if defined(MBEDTLS_THREADING_C) 00582 mbedtls_mutex_init( &heap.mutex ); 00583 mbedtls_platform_set_calloc_free( buffer_alloc_calloc_mutexed, 00584 buffer_alloc_free_mutexed ); 00585 #else 00586 mbedtls_platform_set_calloc_free( buffer_alloc_calloc, buffer_alloc_free ); 00587 #endif 00588 00589 if( (size_t) buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE ) 00590 { 00591 /* Adjust len first since buf is used in the computation */ 00592 len -= MBEDTLS_MEMORY_ALIGN_MULTIPLE 00593 - (size_t) buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE; 00594 buf += MBEDTLS_MEMORY_ALIGN_MULTIPLE 00595 - (size_t) buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE; 00596 } 00597 00598 heap.buf = buf; 00599 heap.len = len; 00600 00601 heap.first = (memory_header *) buf; 00602 heap.first->size = len - sizeof(memory_header); 00603 heap.first->magic1 = MAGIC1; 00604 heap.first->magic2 = MAGIC2; 00605 heap.first_free = heap.first; 00606 } 00607 00608 void mbedtls_memory_buffer_alloc_free() 00609 { 00610 #if defined(MBEDTLS_THREADING_C) 00611 mbedtls_mutex_free( &heap.mutex ); 00612 #endif 00613 mbedtls_zeroize( &heap, sizeof(buffer_alloc_ctx) ); 00614 } 00615 00616 #if defined(MBEDTLS_SELF_TEST) 00617 static int check_pointer( void *p ) 00618 { 00619 if( p == NULL ) 00620 return( -1 ); 00621 00622 if( (size_t) p % MBEDTLS_MEMORY_ALIGN_MULTIPLE != 0 ) 00623 return( -1 ); 00624 00625 return( 0 ); 00626 } 00627 00628 static int check_all_free( ) 00629 { 00630 if( 00631 #if defined(MBEDTLS_MEMORY_DEBUG) 00632 heap.total_used != 0 || 00633 #endif 00634 heap.first != heap.first_free || 00635 (void *) heap.first != (void *) heap.buf ) 00636 { 00637 return( -1 ); 00638 } 00639 00640 return( 0 ); 00641 } 00642 00643 #define TEST_ASSERT( condition ) \ 00644 if( ! (condition) ) \ 00645 { \ 00646 if( verbose != 0 ) \ 00647 mbedtls_printf( "failed\n" ); \ 00648 \ 00649 ret = 1; \ 00650 goto cleanup; \ 00651 } 00652 00653 int mbedtls_memory_buffer_alloc_self_test( int verbose ) 00654 { 00655 unsigned char buf[1024]; 00656 unsigned char *p, *q, *r, *end; 00657 int ret = 0; 00658 00659 if( verbose != 0 ) 00660 mbedtls_printf( " MBA test #1 (basic alloc-free cycle): " ); 00661 00662 mbedtls_memory_buffer_alloc_init( buf, sizeof( buf ) ); 00663 00664 p = mbedtls_calloc( 1, 1 ); 00665 q = mbedtls_calloc( 1, 128 ); 00666 r = mbedtls_calloc( 1, 16 ); 00667 00668 TEST_ASSERT( check_pointer( p ) == 0 && 00669 check_pointer( q ) == 0 && 00670 check_pointer( r ) == 0 ); 00671 00672 mbedtls_free( r ); 00673 mbedtls_free( q ); 00674 mbedtls_free( p ); 00675 00676 TEST_ASSERT( check_all_free( ) == 0 ); 00677 00678 /* Memorize end to compare with the next test */ 00679 end = heap.buf + heap.len; 00680 00681 mbedtls_memory_buffer_alloc_free( ); 00682 00683 if( verbose != 0 ) 00684 mbedtls_printf( "passed\n" ); 00685 00686 if( verbose != 0 ) 00687 mbedtls_printf( " MBA test #2 (buf not aligned): " ); 00688 00689 mbedtls_memory_buffer_alloc_init( buf + 1, sizeof( buf ) - 1 ); 00690 00691 TEST_ASSERT( heap.buf + heap.len == end ); 00692 00693 p = mbedtls_calloc( 1, 1 ); 00694 q = mbedtls_calloc( 1, 128 ); 00695 r = mbedtls_calloc( 1, 16 ); 00696 00697 TEST_ASSERT( check_pointer( p ) == 0 && 00698 check_pointer( q ) == 0 && 00699 check_pointer( r ) == 0 ); 00700 00701 mbedtls_free( r ); 00702 mbedtls_free( q ); 00703 mbedtls_free( p ); 00704 00705 TEST_ASSERT( check_all_free( ) == 0 ); 00706 00707 mbedtls_memory_buffer_alloc_free( ); 00708 00709 if( verbose != 0 ) 00710 mbedtls_printf( "passed\n" ); 00711 00712 if( verbose != 0 ) 00713 mbedtls_printf( " MBA test #3 (full): " ); 00714 00715 mbedtls_memory_buffer_alloc_init( buf, sizeof( buf ) ); 00716 00717 p = mbedtls_calloc( 1, sizeof( buf ) - sizeof( memory_header ) ); 00718 00719 TEST_ASSERT( check_pointer( p ) == 0 ); 00720 TEST_ASSERT( mbedtls_calloc( 1, 1 ) == NULL ); 00721 00722 mbedtls_free( p ); 00723 00724 p = mbedtls_calloc( 1, sizeof( buf ) - 2 * sizeof( memory_header ) - 16 ); 00725 q = mbedtls_calloc( 1, 16 ); 00726 00727 TEST_ASSERT( check_pointer( p ) == 0 && check_pointer( q ) == 0 ); 00728 TEST_ASSERT( mbedtls_calloc( 1, 1 ) == NULL ); 00729 00730 mbedtls_free( q ); 00731 00732 TEST_ASSERT( mbedtls_calloc( 1, 17 ) == NULL ); 00733 00734 mbedtls_free( p ); 00735 00736 TEST_ASSERT( check_all_free( ) == 0 ); 00737 00738 mbedtls_memory_buffer_alloc_free( ); 00739 00740 if( verbose != 0 ) 00741 mbedtls_printf( "passed\n" ); 00742 00743 cleanup: 00744 mbedtls_memory_buffer_alloc_free( ); 00745 00746 return( ret ); 00747 } 00748 #endif /* MBEDTLS_SELF_TEST */ 00749 00750 #endif /* MBEDTLS_MEMORY_BUFFER_ALLOC_C */
Generated on Tue Jul 12 2022 12:52:44 by
