diff --git a/examples/client/client.c b/examples/client/client.c index b5279250c..e6a32d45a 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -762,12 +762,11 @@ static void Usage(void) #endif } - THREAD_RETURN WOLFSSL_THREAD client_test(void* args) { SOCKET_T sockfd = WOLFSSL_SOCKET_INVALID; - WOLFSSL_METHOD* method = 0; + wolfSSL_method_func method = NULL; WOLFSSL_CTX* ctx = 0; WOLFSSL* ssl = 0; @@ -885,6 +884,22 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) int argc = ((func_args*)args)->argc; char** argv = ((func_args*)args)->argv; + +#ifdef WOLFSSL_STATIC_MEMORY + #if (defined(HAVE_ECC) && !defined(ALT_ECC_SIZE)) \ + || defined(SESSION_CERTS) + /* big enough to handle most cases including session certs */ + byte memory[320000]; + #else + byte memory[80000]; + #endif + byte memoryIO[34500]; /* max for IO buffer (TLS packet can be 16k) */ + WOLFSSL_MEM_CONN_STATS ssl_stats; + #ifdef DEBUG_WOLFSSL + WOLFSSL_MEM_STATS mem_stats; + #endif +#endif + ((func_args*)args)->return_code = -1; /* error state */ #ifdef NO_RSA @@ -1372,17 +1387,17 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) #ifndef NO_OLD_TLS #ifdef WOLFSSL_ALLOW_SSLV3 case 0: - method = wolfSSLv3_client_method(); + method = wolfSSLv3_client_method_ex; break; #endif #ifndef NO_TLS case 1: - method = wolfTLSv1_client_method(); + method = wolfTLSv1_client_method_ex; break; case 2: - method = wolfTLSv1_1_client_method(); + method = wolfTLSv1_1_client_method_ex; break; #endif /* NO_TLS */ @@ -1390,11 +1405,11 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) #ifndef NO_TLS case 3: - method = wolfTLSv1_2_client_method(); + method = wolfTLSv1_2_client_method_ex; break; #ifdef WOLFSSL_TLS13 case 4: - method = wolfTLSv1_3_client_method(); + method = wolfTLSv1_3_client_method_ex; break; #endif #endif @@ -1402,12 +1417,12 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) #ifdef WOLFSSL_DTLS #ifndef NO_OLD_TLS case -1: - method = wolfDTLSv1_client_method(); + method = wolfDTLSv1_client_method_ex; break; #endif case -2: - method = wolfDTLSv1_2_client_method(); + method = wolfDTLSv1_2_client_method_ex; break; #endif @@ -1419,7 +1434,32 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) if (method == NULL) err_sys("unable to get method"); - ctx = wolfSSL_CTX_new(method); + +#ifdef WOLFSSL_STATIC_MEMORY + #ifdef DEBUG_WOLFSSL + /* print off helper buffer sizes for use with static memory + * printing to stderr incase of debug mode turned on */ + fprintf(stderr, "static memory management size = %d\n", + wolfSSL_MemoryPaddingSz()); + fprintf(stderr, "calculated optimum general buffer size = %d\n", + wolfSSL_StaticBufferSz(memory, sizeof(memory), 0)); + fprintf(stderr, "calculated optimum IO buffer size = %d\n", + wolfSSL_StaticBufferSz(memoryIO, sizeof(memoryIO), + WOLFMEM_IO_POOL_FIXED)); + #endif /* DEBUG_WOLFSSL */ + + if (wolfSSL_CTX_load_static_memory(&ctx, method, memory, sizeof(memory), + 0, 1) != WOLFSSL_SUCCESS) { + err_sys("unable to load static memory"); + } + + if (wolfSSL_CTX_load_static_memory(&ctx, NULL, memoryIO, sizeof(memoryIO), + WOLFMEM_IO_POOL_FIXED | WOLFMEM_TRACK_STATS, 1) != WOLFSSL_SUCCESS) { + err_sys("unable to load static memory"); + } +#else + ctx = wolfSSL_CTX_new(method(NULL)); +#endif if (ctx == NULL) err_sys("unable to get ctx"); @@ -1708,6 +1748,14 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) wolfSSL_CTX_allow_post_handshake_auth(ctx); #endif +#if defined(WOLFSSL_STATIC_MEMORY) && defined(DEBUG_WOLFSSL) + fprintf(stderr, "Before creating SSL\n"); + if (wolfSSL_CTX_is_static_memory(ctx, &mem_stats) != 1) + err_sys("ctx not using static memory"); + if (wolfSSL_PrintStats(&mem_stats) != 1) /* function in test.h */ + err_sys("error printing out memory stats"); +#endif + if (doMcast) { #ifdef WOLFSSL_MULTICAST wolfSSL_CTX_mcast_set_member_id(ctx, mcastID); @@ -1729,6 +1777,14 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) wolfSSL_KeepArrays(ssl); #endif +#if defined(WOLFSSL_STATIC_MEMORY) && defined(DEBUG_WOLFSSL) + fprintf(stderr, "After creating SSL\n"); + if (wolfSSL_CTX_is_static_memory(ctx, &mem_stats) != 1) + err_sys("ctx not using static memory"); + if (wolfSSL_PrintStats(&mem_stats) != 1) /* function in test.h */ + err_sys("error printing out memory stats"); +#endif + #ifdef WOLFSSL_TLS13 if (!helloRetry) { if (onlyKeyShare == 0 || onlyKeyShare == 2) { @@ -2070,12 +2126,6 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) #ifndef NO_SESSION_CACHE if (resumeSession) { session = wolfSSL_get_session(ssl); - sslResume = wolfSSL_new(ctx); - if (sslResume == NULL) { - wolfSSL_free(ssl); - wolfSSL_CTX_free(ctx); - err_sys("unable to get SSL object"); - } } #endif @@ -2088,11 +2138,33 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) if (atomicUser) FreeAtomicUser(ssl); #endif + + /* display collected statistics */ +#ifdef WOLFSSL_STATIC_MEMORY + if (wolfSSL_is_static_memory(ssl, &ssl_stats) != 1) + err_sys("static memory was not used with ssl"); + + fprintf(stderr, "\nprint off SSL memory stats\n"); + fprintf(stderr, "*** This is memory state before wolfSSL_free is called\n"); + fprintf(stderr, "peak connection memory = %d\n", ssl_stats.peakMem); + fprintf(stderr, "current memory in use = %d\n", ssl_stats.curMem); + fprintf(stderr, "peak connection allocs = %d\n", ssl_stats.peakAlloc); + fprintf(stderr, "current connection allocs = %d\n", ssl_stats.curAlloc); + fprintf(stderr, "total connection allocs = %d\n", ssl_stats.totalAlloc); + fprintf(stderr, "total connection frees = %d\n\n", ssl_stats.totalFr); +#endif + wolfSSL_free(ssl); CloseSocket(sockfd); #ifndef NO_SESSION_CACHE if (resumeSession) { + sslResume = wolfSSL_new(ctx); + if (sslResume == NULL) { + wolfSSL_CTX_free(ctx); + err_sys("unable to get SSL object"); + } + if (dtlsUDP) { #ifdef USE_WINDOWS_API Sleep(500); @@ -2382,6 +2454,21 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) if (wc_shutdown && ret == WOLFSSL_SHUTDOWN_NOT_DONE) wolfSSL_shutdown(sslResume); /* bidirectional shutdown */ + /* display collected statistics */ + #ifdef WOLFSSL_STATIC_MEMORY + if (wolfSSL_is_static_memory(sslResume, &ssl_stats) != 1) + err_sys("static memory was not used with ssl"); + + fprintf(stderr, "\nprint off SSLresume memory stats\n"); + fprintf(stderr, "*** This is memory state before wolfSSL_free is called\n"); + fprintf(stderr, "peak connection memory = %d\n", ssl_stats.peakMem); + fprintf(stderr, "current memory in use = %d\n", ssl_stats.curMem); + fprintf(stderr, "peak connection allocs = %d\n", ssl_stats.peakAlloc); + fprintf(stderr, "current connection allocs = %d\n", ssl_stats.curAlloc); + fprintf(stderr, "total connection allocs = %d\n", ssl_stats.totalAlloc); + fprintf(stderr, "total connection frees = %d\n\n", ssl_stats.totalFr); + #endif + wolfSSL_free(sslResume); CloseSocket(sockfd); } diff --git a/examples/server/server.c b/examples/server/server.c index eb976fc59..08c0cf000 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -534,8 +534,11 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args) #else byte memory[80000]; #endif - byte memoryIO[34500]; /* max of 17k for IO buffer (TLS packet can be 16k) */ + byte memoryIO[34500]; /* max for IO buffer (TLS packet can be 16k) */ WOLFSSL_MEM_CONN_STATS ssl_stats; + #ifdef DEBUG_WOLFSSL + WOLFSSL_MEM_STATS mem_stats; + #endif #endif ((func_args*)args)->return_code = -1; /* error state */ @@ -1153,14 +1156,11 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args) } } #if defined(WOLFSSL_STATIC_MEMORY) && defined(DEBUG_WOLFSSL) - { - WOLFSSL_MEM_STATS mem_stats; fprintf(stderr, "Before creating SSL\n"); if (wolfSSL_CTX_is_static_memory(ctx, &mem_stats) != 1) err_sys_ex(runWithErrors, "ctx not using static memory"); if (wolfSSL_PrintStats(&mem_stats) != 1) /* function in test.h */ err_sys_ex(runWithErrors, "error printing out memory stats"); - } #endif if (doMcast) { @@ -1185,14 +1185,11 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args) #endif #if defined(WOLFSSL_STATIC_MEMORY) && defined(DEBUG_WOLFSSL) - { - WOLFSSL_MEM_STATS mem_stats; fprintf(stderr, "After creating SSL\n"); if (wolfSSL_CTX_is_static_memory(ctx, &mem_stats) != 1) err_sys_ex(runWithErrors, "ctx not using static memory"); if (wolfSSL_PrintStats(&mem_stats) != 1) /* function in test.h */ err_sys_ex(runWithErrors, "error printing out memory stats"); - } #endif if (doMcast) { diff --git a/scripts/resume.test b/scripts/resume.test index 6b6ad488e..5badb4838 100755 --- a/scripts/resume.test +++ b/scripts/resume.test @@ -71,7 +71,7 @@ do_test() { if [ $client_result != 0 ] then - echo -e "client failed!" + echo -e "client failed!\ncapture_out=$capture_out\nclient_result=$client_result" do_cleanup exit 1 fi diff --git a/src/internal.c b/src/internal.c index 0e15c5a5c..c45aa2bb4 100644 --- a/src/internal.c +++ b/src/internal.c @@ -2838,7 +2838,7 @@ void FreeX509(WOLFSSL_X509* x509) } #endif /* OPENSSL_EXTRA */ if (x509->altNames) - FreeAltNames(x509->altNames, NULL); + FreeAltNames(x509->altNames, x509->heap); } #endif /* !NO_DH || HAVE_ECC */ @@ -4850,6 +4850,7 @@ void SSL_ResourceFree(WOLFSSL* ssl) #endif WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap; WOLFSSL_HEAP* ctx_heap; + void* heap = ssl->ctx ? ssl->ctx->heap : ssl->heap; ctx_heap = ssl_hint->memory; if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) { @@ -4869,9 +4870,9 @@ void SSL_ResourceFree(WOLFSSL* ssl) /* check if tracking stats */ if (ctx_heap->flag & WOLFMEM_TRACK_STATS) { - XFREE(ssl_hint->stats, ssl->ctx->heap, DYNAMIC_TYPE_SSL); + XFREE(ssl_hint->stats, heap, DYNAMIC_TYPE_SSL); } - XFREE(ssl->heap, ssl->ctx->heap, DYNAMIC_TYPE_SSL); + XFREE(ssl->heap, heap, DYNAMIC_TYPE_SSL); #ifdef WOLFSSL_HEAP_TEST } #endif