@@ -514,20 +514,39 @@ void* wolfSSL_Realloc(void *ptr, size_t size)
514514struct wc_Memory {
515515 byte * buffer ;
516516 struct wc_Memory * next ;
517+ #ifdef WOLFSSL_LEAN_STATIC_MEMORY
518+ /* lean static memory is assumed to be under 65k */
519+ word16 sz ;
520+ #else
517521 word32 sz ;
522+ #endif
523+ #ifdef WOLFSSL_DEBUG_MEMORY
524+ word16 szUsed ;
525+ #endif
518526};
519527
520528
529+ #ifdef WOLFSSL_DEBUG_MEMORY_CALLBACK
530+ static DebugMemoryCb DebugCb = NULL ;
531+
532+ /* Used to set a debug memory callback. Helpful in cases where
533+ * printf is not available. */
534+ void wolfSSL_SetDebugCallback (DebugMemoryCb in )
535+ {
536+ DebugCb = in ;
537+ }
538+ #endif
539+
521540/* returns amount of memory used on success. On error returns negative value
522541 wc_Memory** list is the list that new buckets are prepended to
523542 */
524543static int wc_create_memory_buckets (byte * buffer , word32 bufSz ,
525- word32 buckSz , word32 buckNum , wc_Memory * * list ) {
526- word32 i ;
544+ word32 buckSz , byte buckNum , wc_Memory * * list ) {
527545 byte * pt = buffer ;
528546 int ret = 0 ;
529- word32 memSz = (word32 )sizeof (wc_Memory );
530- word32 padSz = - (int )memSz & (WOLFSSL_STATIC_ALIGN - 1 );
547+ byte memSz = (byte )sizeof (wc_Memory );
548+ word16 padSz = - (int )memSz & (WOLFSSL_STATIC_ALIGN - 1 );
549+ word16 i ;
531550
532551 /* if not enough space available for bucket size then do not try */
533552 if (buckSz + memSz + padSz > bufSz ) {
@@ -542,6 +561,12 @@ static int wc_create_memory_buckets(byte* buffer, word32 bufSz,
542561 mem -> buffer = (byte * )pt + padSz + memSz ;
543562 mem -> next = NULL ;
544563
564+ #ifdef WOLFSSL_DEBUG_MEMORY_CALLBACK
565+ if (DebugCb ) {
566+ DebugCb (buckSz , buckSz , WOLFSSL_DEBUG_MEMORY_INIT , 0 );
567+ }
568+ #endif
569+
545570 /* add the newly created struct to front of list */
546571 if (* list == NULL ) {
547572 * list = mem ;
@@ -568,8 +593,8 @@ static int wc_partition_static_memory(byte* buffer, word32 sz, int flag,
568593 word32 ava = sz ;
569594 byte * pt = buffer ;
570595 int ret = 0 ;
571- word32 memSz = (word32 )sizeof (wc_Memory );
572- word32 padSz = - (int )memSz & (WOLFSSL_STATIC_ALIGN - 1 );
596+ byte memSz = (word32 )sizeof (wc_Memory );
597+ byte padSz = - (int )memSz & (WOLFSSL_STATIC_ALIGN - 1 );
573598
574599 WOLFSSL_ENTER ("wc_partition_static_memory" );
575600
@@ -631,15 +656,25 @@ static int wc_partition_static_memory(byte* buffer, word32 sz, int flag,
631656static int wc_init_memory_heap (WOLFSSL_HEAP * heap , unsigned int listSz ,
632657 const unsigned int * sizeList , const unsigned int * distList )
633658{
659+ word16 i ;
660+
634661 XMEMSET (heap , 0 , sizeof (WOLFSSL_HEAP ));
635662
636- XMEMCPY (heap -> sizeList , sizeList , listSz * sizeof (sizeList [0 ]));
637- XMEMCPY (heap -> distList , distList , listSz * sizeof (distList [0 ]));
663+ /* avoid XMEMCPY for LEAN static memory build */
664+ for (i = 0 ; i < listSz ; i ++ ) {
665+ heap -> sizeList [i ] = sizeList [i ];
666+ }
667+
668+ for (i = 0 ; i < listSz ; i ++ ) {
669+ heap -> distList [i ] = distList [i ];
670+ }
638671
672+ #ifndef SINGLE_THREADED
639673 if (wc_InitMutex (& (heap -> memory_mutex )) != 0 ) {
640674 WOLFSSL_MSG ("Error creating heap memory mutex" );
641675 return BAD_MUTEX_E ;
642676 }
677+ #endif
643678
644679 return 0 ;
645680}
@@ -651,7 +686,7 @@ int wc_LoadStaticMemory_ex(WOLFSSL_HEAP_HINT** pHint,
651686{
652687 WOLFSSL_HEAP * heap = NULL ;
653688 WOLFSSL_HEAP_HINT * hint = NULL ;
654- word32 idx = 0 ;
689+ word16 idx = 0 ;
655690 int ret ;
656691
657692 WOLFSSL_ENTER ("wc_LoadStaticMemory_ex" );
@@ -704,15 +739,16 @@ int wc_LoadStaticMemory_ex(WOLFSSL_HEAP_HINT** pHint,
704739 return MEMORY_E ;
705740 }
706741
742+ #ifndef WOLFSSL_LEAN_STATIC_MEMORY
707743 /* determine what max applies too */
708744 if ((flag & WOLFMEM_IO_POOL ) || (flag & WOLFMEM_IO_POOL_FIXED )) {
709745 heap -> maxIO = maxSz ;
710746 }
711747 else { /* general memory used in handshakes */
712748 heap -> maxHa = maxSz ;
713749 }
714-
715750 heap -> flag |= flag ;
751+ #endif
716752 * pHint = hint ;
717753
718754 return 0 ;
@@ -721,8 +757,13 @@ int wc_LoadStaticMemory_ex(WOLFSSL_HEAP_HINT** pHint,
721757int wc_LoadStaticMemory (WOLFSSL_HEAP_HINT * * pHint ,
722758 unsigned char * buf , unsigned int sz , int flag , int maxSz )
723759{
760+ #ifdef WOLFSSL_LEAN_STATIC_PSK
761+ word16 sizeList [WOLFMEM_DEF_BUCKETS ] = { WOLFMEM_BUCKETS };
762+ byte distList [WOLFMEM_DEF_BUCKETS ] = { WOLFMEM_DIST };
763+ #else
724764 word32 sizeList [WOLFMEM_DEF_BUCKETS ] = { WOLFMEM_BUCKETS };
725765 word32 distList [WOLFMEM_DEF_BUCKETS ] = { WOLFMEM_DIST };
766+ #endif
726767 int ret = 0 ;
727768
728769 WOLFSSL_ENTER ("wc_LoadStaticMemory" );
@@ -742,7 +783,7 @@ void wc_UnloadStaticMemory(WOLFSSL_HEAP_HINT* heap)
742783 }
743784}
744785
745-
786+ #ifndef WOLFSSL_LEAN_STATIC_MEMORY
746787/* returns the size of management memory needed for each bucket.
747788 * This is memory that is used to keep track of and align memory buckets. */
748789int wolfSSL_MemoryPaddingSz (void )
@@ -782,6 +823,7 @@ int wolfSSL_StaticBufferSz_ex(unsigned int listSz,
782823 ava -- ;
783824 }
784825
826+ #ifndef WOLFSSL_LEAN_STATIC_MEMORY
785827 /* creating only IO buffers from memory passed in, max TLS is 16k */
786828 if (flag & WOLFMEM_IO_POOL || flag & WOLFMEM_IO_POOL_FIXED ) {
787829 if (ava < (memSz + padSz + WOLFMEM_IO_SZ )) {
@@ -790,7 +832,9 @@ int wolfSSL_StaticBufferSz_ex(unsigned int listSz,
790832
791833 ava = ava % (memSz + padSz + WOLFMEM_IO_SZ );
792834 }
793- else {
835+ else
836+ #endif
837+ {
794838 int i , k ;
795839
796840 if (ava < (sizeList [0 ] + padSz + memSz )) {
@@ -897,6 +941,7 @@ int wolfSSL_GetMemStats(WOLFSSL_HEAP* heap, WOLFSSL_MEM_STATS* stats)
897941
898942 return 1 ;
899943}
944+ #endif /* !WOLFSSL_LEAN_STATIC_MEMORY */
900945
901946
902947/* global heap hint to fall back on when no heap hint is passed to
@@ -987,11 +1032,14 @@ void* wolfSSL_Malloc(size_t size, void* heap, int type)
9871032 }
9881033 mem = hint -> memory ;
9891034
1035+ #ifndef SINGLE_THREADED
9901036 if (wc_LockMutex (& (mem -> memory_mutex )) != 0 ) {
9911037 WOLFSSL_MSG ("Bad memory_mutex lock" );
9921038 return NULL ;
9931039 }
1040+ #endif
9941041
1042+ #ifndef WOLFSSL_LEAN_STATIC_MEMORY
9951043 /* case of using fixed IO buffers */
9961044 if (mem -> flag & WOLFMEM_IO_POOL_FIXED &&
9971045 (type == DYNAMIC_TYPE_OUT_BUFFER ||
@@ -1003,7 +1051,10 @@ void* wolfSSL_Malloc(size_t size, void* heap, int type)
10031051 pt = hint -> inBuf ;
10041052 }
10051053 }
1006- else {
1054+ else
1055+ #endif
1056+ {
1057+ #ifndef WOLFSSL_LEANPSK
10071058 /* check if using IO pool flag */
10081059 if (mem -> flag & WOLFMEM_IO_POOL &&
10091060 (type == DYNAMIC_TYPE_OUT_BUFFER ||
@@ -1013,6 +1064,7 @@ void* wolfSSL_Malloc(size_t size, void* heap, int type)
10131064 mem -> io = pt -> next ;
10141065 }
10151066 }
1067+ #endif
10161068
10171069 /* general static memory */
10181070 if (pt == NULL ) {
@@ -1035,14 +1087,21 @@ void* wolfSSL_Malloc(size_t size, void* heap, int type)
10351087 }
10361088
10371089 if (pt != NULL ) {
1038- mem -> inUse += pt -> sz ;
1090+ #ifndef WOLFSSL_LEAN_STATIC_MEMORY
10391091 mem -> alloc += 1 ;
1092+ #endif
10401093 res = pt -> buffer ;
10411094
10421095 #ifdef WOLFSSL_DEBUG_MEMORY
1043- fprintf (stderr , "Alloc: %p -> %u at %s:%d\n" , pt -> buffer , pt -> sz , func , line );
1096+ pt -> szUsed = size ;
1097+ fprintf (stderr , "Alloc: %p -> %lu at %s:%d\n" , pt -> buffer , size , func , line );
10441098 #endif
1045-
1099+ #ifdef WOLFSSL_DEBUG_MEMORY_CALLBACK
1100+ if (DebugCb ) {
1101+ DebugCb (size , pt -> sz , WOLFSSL_DEBUG_MEMORY_ALLOC , type );
1102+ }
1103+ #endif
1104+ #ifndef WOLFSSL_LEAN_STATIC_MEMORY
10461105 /* keep track of connection statistics if flag is set */
10471106 if (mem -> flag & WOLFMEM_TRACK_STATS ) {
10481107 WOLFSSL_MEM_CONN_STATS * stats = hint -> stats ;
@@ -1058,16 +1117,24 @@ void* wolfSSL_Malloc(size_t size, void* heap, int type)
10581117 stats -> totalAlloc ++ ;
10591118 }
10601119 }
1120+ #endif
10611121 }
10621122 else {
10631123 WOLFSSL_MSG ("ERROR ran out of static memory" );
1124+ res = NULL ;
10641125 #ifdef WOLFSSL_DEBUG_MEMORY
10651126 fprintf (stderr , "Looking for %lu bytes at %s:%d\n" , (unsigned long ) size , func ,
10661127 line );
10671128 #endif
1129+ #ifdef WOLFSSL_DEBUG_MEMORY_CALLBACK
1130+ if (DebugCb ) {
1131+ DebugCb (size , 0 , WOLFSSL_DEBUG_MEMORY_FAIL , type );
1132+ }
1133+ #endif
10681134 }
1069-
1135+ #ifndef SINGLE_THREADED
10701136 wc_UnLockMutex (& (mem -> memory_mutex ));
1137+ #endif
10711138 }
10721139
10731140 #ifdef WOLFSSL_MALLOC_CHECK
@@ -1148,11 +1215,14 @@ void wolfSSL_Free(void *ptr, void* heap, int type)
11481215
11491216 /* get memory struct and add it to available list */
11501217 pt = (wc_Memory * )((byte * )ptr - sizeof (wc_Memory ) - padSz );
1218+ #ifndef SINGLE_THREADED
11511219 if (wc_LockMutex (& (mem -> memory_mutex )) != 0 ) {
11521220 WOLFSSL_MSG ("Bad memory_mutex lock" );
11531221 return ;
11541222 }
1223+ #endif
11551224
1225+ #ifndef WOLFSSL_LEAN_STATIC_MEMORY
11561226 /* case of using fixed IO buffers */
11571227 if (mem -> flag & WOLFMEM_IO_POOL_FIXED &&
11581228 (type == DYNAMIC_TYPE_OUT_BUFFER ||
@@ -1166,22 +1236,38 @@ void wolfSSL_Free(void *ptr, void* heap, int type)
11661236 pt -> next = mem -> io ;
11671237 mem -> io = pt ;
11681238 }
1169- else { /* general memory free */
1239+ else
1240+ #endif
1241+ { /* general memory free */
11701242 for (i = 0 ; i < WOLFMEM_MAX_BUCKETS ; i ++ ) {
11711243 if (pt -> sz == mem -> sizeList [i ]) {
11721244 pt -> next = mem -> ava [i ];
11731245 mem -> ava [i ] = pt ;
1246+
1247+ #ifdef WOLFSSL_DEBUG_MEMORY_CALLBACK
1248+ if (DebugCb ) {
1249+ #ifdef WOLFSSL_DEBUG_MEMORY
1250+ DebugCb (pt -> szUsed , pt -> sz , WOLFSSL_DEBUG_MEMORY_FREE , type );
1251+ #else
1252+ DebugCb (pt -> sz , pt -> sz , WOLFSSL_DEBUG_MEMORY_FREE , type );
1253+ #endif
1254+ }
1255+ #endif
11741256 break ;
11751257 }
11761258 }
11771259 }
1260+ #ifndef WOLFSSL_LEAN_STATIC_MEMORY
11781261 mem -> inUse -= pt -> sz ;
11791262 mem -> frAlc += 1 ;
1263+ #endif
11801264
11811265 #ifdef WOLFSSL_DEBUG_MEMORY
1182- fprintf (stderr , "Free: %p -> %u at %s:%d\n" , pt -> buffer , pt -> sz , func , line );
1266+ fprintf (stderr , "Free: %p -> %u at %s:%d\n" , pt -> buffer ,
1267+ pt -> szUsed , func , line );
11831268 #endif
11841269
1270+ #ifndef WOLFSSL_LEAN_STATIC_MEMORY
11851271 /* keep track of connection statistics if flag is set */
11861272 if (mem -> flag & WOLFMEM_TRACK_STATS ) {
11871273 WOLFSSL_MEM_CONN_STATS * stats = hint -> stats ;
@@ -1200,7 +1286,10 @@ void wolfSSL_Free(void *ptr, void* heap, int type)
12001286 stats -> totalFr ++ ;
12011287 }
12021288 }
1289+ #endif
1290+ #ifndef SINGLE_THREADED
12031291 wc_UnLockMutex (& (mem -> memory_mutex ));
1292+ #endif
12041293 }
12051294 }
12061295
@@ -1209,6 +1298,7 @@ void wolfSSL_Free(void *ptr, void* heap, int type)
12091298 (void )type ;
12101299}
12111300
1301+ #ifndef WOLFSSL_NO_REALLOC
12121302#ifdef WOLFSSL_DEBUG_MEMORY
12131303void * wolfSSL_Realloc (void * ptr , size_t size , void * heap , int type , const char * func , unsigned int line )
12141304#else
@@ -1256,11 +1346,12 @@ void* wolfSSL_Realloc(void *ptr, size_t size, void* heap, int type)
12561346 return wolfSSL_Malloc (size , heap , type );
12571347 #endif
12581348 }
1259-
1349+ #ifndef SINGLE_THREADED
12601350 if (wc_LockMutex (& (mem -> memory_mutex )) != 0 ) {
12611351 WOLFSSL_MSG ("Bad memory_mutex lock" );
12621352 return NULL ;
12631353 }
1354+ #endif
12641355
12651356 /* case of using fixed IO buffers or IO pool */
12661357 if (((mem -> flag & WOLFMEM_IO_POOL )|| (mem -> flag & WOLFMEM_IO_POOL_FIXED ))
@@ -1287,30 +1378,40 @@ void* wolfSSL_Realloc(void *ptr, size_t size, void* heap, int type)
12871378 }
12881379
12891380 if (pt != NULL && res == NULL ) {
1381+ word32 prvSz ;
1382+
12901383 res = pt -> buffer ;
12911384
12921385 /* copy over original information and free ptr */
1293- word32 prvSz = ((wc_Memory * )((byte * )ptr - padSz -
1386+ prvSz = ((wc_Memory * )((byte * )ptr - padSz -
12941387 sizeof (wc_Memory )))-> sz ;
12951388 prvSz = (prvSz > pt -> sz )? pt -> sz : prvSz ;
12961389 XMEMCPY (pt -> buffer , ptr , prvSz );
1390+ #ifndef WOLFSSL_LEAN_STATIC_MEMORY
12971391 mem -> inUse += pt -> sz ;
12981392 mem -> alloc += 1 ;
1393+ #endif
12991394
13001395 /* free memory that was previously being used */
1396+ #ifndef SINGLE_THREADED
13011397 wc_UnLockMutex (& (mem -> memory_mutex ));
1398+ #endif
13021399 wolfSSL_Free (ptr , heap , type
13031400 #ifdef WOLFSSL_DEBUG_MEMORY
13041401 , func , line
13051402 #endif
13061403 );
1404+ #ifndef SINGLE_THREADED
13071405 if (wc_LockMutex (& (mem -> memory_mutex )) != 0 ) {
13081406 WOLFSSL_MSG ("Bad memory_mutex lock" );
13091407 return NULL ;
13101408 }
1409+ #endif
13111410 }
13121411 }
1412+ #ifndef SINGLE_THREADED
13131413 wc_UnLockMutex (& (mem -> memory_mutex ));
1414+ #endif
13141415 }
13151416
13161417 #ifdef WOLFSSL_MALLOC_CHECK
@@ -1327,7 +1428,7 @@ void* wolfSSL_Realloc(void *ptr, size_t size, void* heap, int type)
13271428 return res ;
13281429}
13291430#endif /* WOLFSSL_STATIC_MEMORY */
1330-
1431+ #endif /* WOLFSSL_NO_REALLOC */
13311432#endif /* USE_WOLFSSL_MEMORY */
13321433
13331434
0 commit comments