forked from wolfSSL/wolfssl
Fix for CTX free heap hint issue. With openssl extra the param
and x509_store.lookup.dirs
are allocated at CTX init and if heap or static pool was used depends on ctx->onHeapHint
. Added test case for this and inline code comment.
This commit is contained in:
@ -2252,13 +2252,25 @@ void wolfSSL_CRYPTO_cleanup_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data)
|
|||||||
}
|
}
|
||||||
#endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
|
#endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
|
||||||
|
|
||||||
/* In case contexts are held in array and don't want to free actual ctx */
|
/* In case contexts are held in array and don't want to free actual ctx. */
|
||||||
|
|
||||||
|
/* The allocations done in InitSSL_Ctx must be free'd with ctx->onHeapHint
|
||||||
|
* logic. A WOLFSSL_CTX can be assigned a static memory heap hint using
|
||||||
|
* wolfSSL_CTX_load_static_memory after CTX creation, which means variables
|
||||||
|
* allocated in InitSSL_Ctx were allocated from heap and should be free'd with
|
||||||
|
* a NULL heap hint. */
|
||||||
void SSL_CtxResourceFree(WOLFSSL_CTX* ctx)
|
void SSL_CtxResourceFree(WOLFSSL_CTX* ctx)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && \
|
#if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && \
|
||||||
defined(HAVE_TLS_EXTENSIONS) && !defined(NO_WOLFSSL_SERVER)
|
defined(HAVE_TLS_EXTENSIONS) && !defined(NO_WOLFSSL_SERVER)
|
||||||
int i;
|
int i;
|
||||||
#endif
|
#endif
|
||||||
|
void* heapAtCTXInit = ctx->heap;
|
||||||
|
#ifdef WOLFSSL_STATIC_MEMORY
|
||||||
|
if (ctx->onHeapHint == 0) {
|
||||||
|
heapAtCTXInit = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_EX_DATA_CLEANUP_HOOKS
|
#ifdef HAVE_EX_DATA_CLEANUP_HOOKS
|
||||||
wolfSSL_CRYPTO_cleanup_ex_data(&ctx->ex_data);
|
wolfSSL_CRYPTO_cleanup_ex_data(&ctx->ex_data);
|
||||||
@ -2268,17 +2280,9 @@ void SSL_CtxResourceFree(WOLFSSL_CTX* ctx)
|
|||||||
wolfEventQueue_Free(&ctx->event_queue);
|
wolfEventQueue_Free(&ctx->event_queue);
|
||||||
#endif /* HAVE_WOLF_EVENT */
|
#endif /* HAVE_WOLF_EVENT */
|
||||||
|
|
||||||
#ifdef WOLFSSL_STATIC_MEMORY
|
XFREE(ctx->method, heapAtCTXInit, DYNAMIC_TYPE_METHOD);
|
||||||
if (ctx->onHeap == 1) {
|
|
||||||
XFREE(ctx->method, ctx->heap, DYNAMIC_TYPE_METHOD);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
XFREE(ctx->method, NULL, DYNAMIC_TYPE_METHOD);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
XFREE(ctx->method, ctx->heap, DYNAMIC_TYPE_METHOD);
|
|
||||||
#endif
|
|
||||||
ctx->method = NULL;
|
ctx->method = NULL;
|
||||||
|
|
||||||
if (ctx->suites) {
|
if (ctx->suites) {
|
||||||
XFREE(ctx->suites, ctx->heap, DYNAMIC_TYPE_SUITES);
|
XFREE(ctx->suites, ctx->heap, DYNAMIC_TYPE_SUITES);
|
||||||
ctx->suites = NULL;
|
ctx->suites = NULL;
|
||||||
@ -2366,7 +2370,7 @@ void SSL_CtxResourceFree(WOLFSSL_CTX* ctx)
|
|||||||
ctx->alpn_cli_protos = NULL;
|
ctx->alpn_cli_protos = NULL;
|
||||||
}
|
}
|
||||||
if (ctx->param) {
|
if (ctx->param) {
|
||||||
XFREE(ctx->param, ctx->heap, DYNAMIC_TYPE_OPENSSL);
|
XFREE(ctx->param, heapAtCTXInit, DYNAMIC_TYPE_OPENSSL);
|
||||||
ctx->param = NULL;
|
ctx->param = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2378,7 +2382,7 @@ void SSL_CtxResourceFree(WOLFSSL_CTX* ctx)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
wc_FreeMutex(&ctx->x509_store.lookup.dirs->lock);
|
wc_FreeMutex(&ctx->x509_store.lookup.dirs->lock);
|
||||||
XFREE(ctx->x509_store.lookup.dirs, ctx->heap, DYNAMIC_TYPE_OPENSSL);
|
XFREE(ctx->x509_store.lookup.dirs, heapAtCTXInit, DYNAMIC_TYPE_OPENSSL);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef WOLFSSL_STATIC_EPHEMERAL
|
#ifdef WOLFSSL_STATIC_EPHEMERAL
|
||||||
@ -2395,6 +2399,7 @@ void SSL_CtxResourceFree(WOLFSSL_CTX* ctx)
|
|||||||
FreeDer(&ctx->staticKE.x25519Key);
|
FreeDer(&ctx->staticKE.x25519Key);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
(void)heapAtCTXInit;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WOLFSSL_STATIC_MEMORY
|
#ifdef WOLFSSL_STATIC_MEMORY
|
||||||
@ -2418,7 +2423,7 @@ void FreeSSL_Ctx(WOLFSSL_CTX* ctx)
|
|||||||
int refCount;
|
int refCount;
|
||||||
void* heap = ctx->heap;
|
void* heap = ctx->heap;
|
||||||
#ifdef WOLFSSL_STATIC_MEMORY
|
#ifdef WOLFSSL_STATIC_MEMORY
|
||||||
if (ctx->onHeap == 0) {
|
if (ctx->onHeapHint == 0) {
|
||||||
heap = NULL;
|
heap = NULL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -469,14 +469,14 @@ WOLFSSL_CTX* wolfSSL_CTX_new_ex(WOLFSSL_METHOD* method, void* heap)
|
|||||||
if (method == NULL)
|
if (method == NULL)
|
||||||
return ctx;
|
return ctx;
|
||||||
|
|
||||||
ctx = (WOLFSSL_CTX*) XMALLOC(sizeof(WOLFSSL_CTX), heap, DYNAMIC_TYPE_CTX);
|
ctx = (WOLFSSL_CTX*)XMALLOC(sizeof(WOLFSSL_CTX), heap, DYNAMIC_TYPE_CTX);
|
||||||
if (ctx) {
|
if (ctx) {
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = InitSSL_Ctx(ctx, method, heap);
|
ret = InitSSL_Ctx(ctx, method, heap);
|
||||||
#ifdef WOLFSSL_STATIC_MEMORY
|
#ifdef WOLFSSL_STATIC_MEMORY
|
||||||
if (heap != NULL) {
|
if (heap != NULL) {
|
||||||
ctx->onHeap = 1; /* free the memory back to heap when done */
|
ctx->onHeapHint = 1; /* free the memory back to heap when done */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
97
tests/api.c
97
tests/api.c
@ -50418,55 +50418,22 @@ static void test_wolfSSL_CTX_StaticMemory_TLS(int tlsVer,
|
|||||||
#endif /* WOLFSSL_STATIC_MEMORY && HAVE_IO_TESTS_DEPENDENCIES */
|
#endif /* WOLFSSL_STATIC_MEMORY && HAVE_IO_TESTS_DEPENDENCIES */
|
||||||
|
|
||||||
#ifdef WOLFSSL_STATIC_MEMORY
|
#ifdef WOLFSSL_STATIC_MEMORY
|
||||||
#if (defined(HAVE_ECC) && !defined(ALT_ECC_SIZE)) || \
|
#if (defined(HAVE_ECC) && !defined(ALT_ECC_SIZE)) || \
|
||||||
defined(SESSION_CERTS)
|
defined(SESSION_CERTS)
|
||||||
#ifdef OPENSSL_EXTRA
|
#ifdef OPENSSL_EXTRA
|
||||||
#define TEST_TLS_STATIC_MEMSZ (400000)
|
#define TEST_TLS_STATIC_MEMSZ (400000)
|
||||||
#else
|
|
||||||
#define TEST_TLS_STATIC_MEMSZ (320000)
|
|
||||||
#endif
|
|
||||||
#else
|
#else
|
||||||
#define TEST_TLS_STATIC_MEMSZ (80000)
|
#define TEST_TLS_STATIC_MEMSZ (320000)
|
||||||
#endif
|
#endif
|
||||||
|
#else
|
||||||
|
#define TEST_TLS_STATIC_MEMSZ (80000)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void test_wolfSSL_CTX_StaticMemory(void)
|
static void test_wolfSSL_CTX_StaticMemory_SSL(WOLFSSL_CTX* ctx)
|
||||||
{
|
{
|
||||||
#ifdef WOLFSSL_STATIC_MEMORY
|
|
||||||
wolfSSL_method_func method_func;
|
|
||||||
WOLFSSL_CTX* ctx = NULL;
|
|
||||||
const int kMaxCtxClients = 2;
|
|
||||||
WOLFSSL *ssl1 = NULL, *ssl2 = NULL, *ssl3 = NULL;
|
WOLFSSL *ssl1 = NULL, *ssl2 = NULL, *ssl3 = NULL;
|
||||||
WOLFSSL_MEM_STATS mem_stats;
|
WOLFSSL_MEM_STATS mem_stats;
|
||||||
WOLFSSL_MEM_CONN_STATS ssl_stats;
|
WOLFSSL_MEM_CONN_STATS ssl_stats;
|
||||||
#ifdef HAVE_IO_TESTS_DEPENDENCIES
|
|
||||||
#if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519)
|
|
||||||
int tlsVer;
|
|
||||||
byte cliMem[TEST_TLS_STATIC_MEMSZ];
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
byte svrMem[TEST_TLS_STATIC_MEMSZ];
|
|
||||||
|
|
||||||
printf(testingFmt, "test_wolfSSL_CTX_StaticMemory()");
|
|
||||||
|
|
||||||
#ifndef NO_WOLFSSL_SERVER
|
|
||||||
#ifndef WOLFSSL_NO_TLS12
|
|
||||||
method_func = wolfTLSv1_2_server_method_ex;
|
|
||||||
#else
|
|
||||||
method_func = wolfTLSv1_3_server_method_ex;
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#ifndef WOLFSSL_NO_TLS12
|
|
||||||
method_func = wolfTLSv1_2_client_method_ex;
|
|
||||||
#else
|
|
||||||
method_func = wolfTLSv1_3_client_method_ex;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Simple test for static memory with WOLFSSL CTX */
|
|
||||||
AssertIntEQ(wolfSSL_CTX_load_static_memory(
|
|
||||||
&ctx, method_func, svrMem, sizeof(svrMem),
|
|
||||||
0, kMaxCtxClients), WOLFSSL_SUCCESS);
|
|
||||||
|
|
||||||
#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && !defined(NO_RSA)
|
#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && !defined(NO_RSA)
|
||||||
AssertIntEQ(wolfSSL_CTX_use_certificate_file(ctx, svrCertFile,
|
AssertIntEQ(wolfSSL_CTX_use_certificate_file(ctx, svrCertFile,
|
||||||
@ -50497,6 +50464,54 @@ static void test_wolfSSL_CTX_StaticMemory(void)
|
|||||||
|
|
||||||
wolfSSL_free(ssl1);
|
wolfSSL_free(ssl1);
|
||||||
wolfSSL_free(ssl2);
|
wolfSSL_free(ssl2);
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_STATIC_MEMORY */
|
||||||
|
|
||||||
|
static void test_wolfSSL_CTX_StaticMemory(void)
|
||||||
|
{
|
||||||
|
#ifdef WOLFSSL_STATIC_MEMORY
|
||||||
|
wolfSSL_method_func method_func;
|
||||||
|
WOLFSSL_CTX* ctx;
|
||||||
|
const int kMaxCtxClients = 2;
|
||||||
|
#ifdef HAVE_IO_TESTS_DEPENDENCIES
|
||||||
|
#if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519)
|
||||||
|
int tlsVer;
|
||||||
|
byte cliMem[TEST_TLS_STATIC_MEMSZ];
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
byte svrMem[TEST_TLS_STATIC_MEMSZ];
|
||||||
|
|
||||||
|
printf(testingFmt, "test_wolfSSL_CTX_StaticMemory()");
|
||||||
|
|
||||||
|
#ifndef NO_WOLFSSL_SERVER
|
||||||
|
#ifndef WOLFSSL_NO_TLS12
|
||||||
|
method_func = wolfTLSv1_2_server_method_ex;
|
||||||
|
#else
|
||||||
|
method_func = wolfTLSv1_3_server_method_ex;
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifndef WOLFSSL_NO_TLS12
|
||||||
|
method_func = wolfTLSv1_2_client_method_ex;
|
||||||
|
#else
|
||||||
|
method_func = wolfTLSv1_3_client_method_ex;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Test creating CTX directly from static memory pool */
|
||||||
|
ctx = NULL;
|
||||||
|
AssertIntEQ(wolfSSL_CTX_load_static_memory(
|
||||||
|
&ctx, method_func, svrMem, sizeof(svrMem),
|
||||||
|
0, kMaxCtxClients), WOLFSSL_SUCCESS);
|
||||||
|
test_wolfSSL_CTX_StaticMemory_SSL(ctx);
|
||||||
|
wolfSSL_CTX_free(ctx);
|
||||||
|
ctx = NULL;
|
||||||
|
|
||||||
|
/* Test for heap allocated CTX, then assigning static pool to it */
|
||||||
|
AssertNotNull(ctx = wolfSSL_CTX_new(method_func(NULL)));
|
||||||
|
AssertIntEQ(wolfSSL_CTX_load_static_memory(&ctx,
|
||||||
|
NULL, svrMem, sizeof(svrMem),
|
||||||
|
0, kMaxCtxClients), WOLFSSL_SUCCESS);
|
||||||
|
test_wolfSSL_CTX_StaticMemory_SSL(ctx);
|
||||||
wolfSSL_CTX_free(ctx);
|
wolfSSL_CTX_free(ctx);
|
||||||
|
|
||||||
/* TLS Level Tests using static memory */
|
/* TLS Level Tests using static memory */
|
||||||
|
@ -2811,7 +2811,7 @@ struct WOLFSSL_CTX {
|
|||||||
byte disallowEncThenMac:1; /* Don't do Encrypt-Then-MAC */
|
byte disallowEncThenMac:1; /* Don't do Encrypt-Then-MAC */
|
||||||
#endif
|
#endif
|
||||||
#ifdef WOLFSSL_STATIC_MEMORY
|
#ifdef WOLFSSL_STATIC_MEMORY
|
||||||
byte onHeap:1; /* whether the ctx/method is put on heap hint */
|
byte onHeapHint:1; /* whether the ctx/method is put on heap hint */
|
||||||
#endif
|
#endif
|
||||||
#ifdef WOLFSSL_MULTICAST
|
#ifdef WOLFSSL_MULTICAST
|
||||||
byte haveMcast; /* multicast requested */
|
byte haveMcast; /* multicast requested */
|
||||||
|
Reference in New Issue
Block a user