mbed client lightswitch demo
Dependencies: mbed Socket lwip-eth lwip-sys lwip
Fork of mbed-client-classic-example-lwip 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 18:27:24 by 1.7.2