@@ -899,6 +899,17 @@ int wolfSSL_GetMemStats(WOLFSSL_HEAP* heap, WOLFSSL_MEM_STATS* stats)
899899}
900900
901901
902+ /* global heap hint to fall back on when no heap hint is passed to
903+ * XMALLOC/XFREE
904+ * NOT thread safe, should be set once before any expected XMALLOC XFREE calls
905+ */
906+ static void * globalHeapHint = NULL ;
907+ void wolfSSL_SetGlobalHeapHint (void * heap )
908+ {
909+ globalHeapHint = heap ;
910+ }
911+
912+
902913#ifdef WOLFSSL_DEBUG_MEMORY
903914void * wolfSSL_Malloc (size_t size , void * heap , int type , const char * func , unsigned int line )
904915#else
@@ -917,7 +928,7 @@ void* wolfSSL_Malloc(size_t size, void* heap, int type)
917928#endif
918929
919930 /* if no heap hint then use dynamic memory*/
920- if (heap == NULL ) {
931+ if (heap == NULL && globalHeapHint == NULL ) {
921932 #ifdef WOLFSSL_HEAP_TEST
922933 /* allow using malloc for creating ctx and method */
923934 if (type == DYNAMIC_TYPE_CTX || type == DYNAMIC_TYPE_METHOD ||
@@ -952,7 +963,12 @@ void* wolfSSL_Malloc(size_t size, void* heap, int type)
952963 }
953964 else {
954965 WOLFSSL_HEAP_HINT * hint = (WOLFSSL_HEAP_HINT * )heap ;
955- WOLFSSL_HEAP * mem = hint -> memory ;
966+ WOLFSSL_HEAP * mem ;
967+
968+ if (hint == NULL ) {
969+ hint = (WOLFSSL_HEAP_HINT * )globalHeapHint ;
970+ }
971+ mem = hint -> memory ;
956972
957973 if (wc_LockMutex (& (mem -> memory_mutex )) != 0 ) {
958974 WOLFSSL_MSG ("Bad memory_mutex lock" );
@@ -1073,7 +1089,7 @@ void wolfSSL_Free(void *ptr, void* heap, int type)
10731089 }
10741090 #endif
10751091
1076- if (heap == NULL ) {
1092+ if (heap == NULL && globalHeapHint == NULL ) {
10771093 #ifdef WOLFSSL_HEAP_TEST
10781094 /* allow using malloc for creating ctx and method */
10791095 if (type == DYNAMIC_TYPE_CTX || type == DYNAMIC_TYPE_METHOD ||
@@ -1098,9 +1114,14 @@ void wolfSSL_Free(void *ptr, void* heap, int type)
10981114 }
10991115 else {
11001116 WOLFSSL_HEAP_HINT * hint = (WOLFSSL_HEAP_HINT * )heap ;
1101- WOLFSSL_HEAP * mem = hint -> memory ;
1117+ WOLFSSL_HEAP * mem ;
11021118 word32 padSz = - (int )sizeof (wc_Memory ) & (WOLFSSL_STATIC_ALIGN - 1 );
11031119
1120+ if (hint == NULL ) {
1121+ hint = (WOLFSSL_HEAP_HINT * )globalHeapHint ;
1122+ }
1123+ mem = hint -> memory ;
1124+
11041125 /* get memory struct and add it to available list */
11051126 pt = (wc_Memory * )((byte * )ptr - sizeof (wc_Memory ) - padSz );
11061127 if (wc_LockMutex (& (mem -> memory_mutex )) != 0 ) {
@@ -1181,7 +1202,7 @@ void* wolfSSL_Realloc(void *ptr, size_t size, void* heap, int type)
11811202 }
11821203#endif
11831204
1184- if (heap == NULL ) {
1205+ if (heap == NULL && globalHeapHint == NULL ) {
11851206 #ifdef WOLFSSL_HEAP_TEST
11861207 WOLFSSL_MSG ("ERROR null heap hint passed in to XREALLOC" );
11871208 #endif
@@ -1193,9 +1214,14 @@ void* wolfSSL_Realloc(void *ptr, size_t size, void* heap, int type)
11931214 }
11941215 else {
11951216 WOLFSSL_HEAP_HINT * hint = (WOLFSSL_HEAP_HINT * )heap ;
1196- WOLFSSL_HEAP * mem = hint -> memory ;
1217+ WOLFSSL_HEAP * mem ;
11971218 word32 padSz = - (int )sizeof (wc_Memory ) & (WOLFSSL_STATIC_ALIGN - 1 );
11981219
1220+ if (hint == NULL ) {
1221+ hint = (WOLFSSL_HEAP_HINT * )globalHeapHint ;
1222+ }
1223+ mem = hint -> memory ;
1224+
11991225 if (ptr == NULL ) {
12001226 #ifdef WOLFSSL_DEBUG_MEMORY
12011227 return wolfSSL_Malloc (size , heap , type , func , line );
0 commit comments