From e6746639afdef27132e3061457851d4e710b7eab Mon Sep 17 00:00:00 2001 From: JacobBarthelmeh Date: Tue, 30 Jun 2020 13:16:28 -0600 Subject: [PATCH] add SSL_SESSION_up_ref and fix for get lib --- src/ssl.c | 21 ++++++++++++++++++++- wolfssl/internal.h | 2 ++ wolfssl/openssl/ssl.h | 1 + wolfssl/ssl.h | 1 + 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/ssl.c b/src/ssl.c index f95ec4f1b..94c9c273a 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -19277,6 +19277,22 @@ int wolfSSL_session_reused(WOLFSSL* ssl) } #if defined(OPENSSL_EXTRA) || defined(HAVE_EXT_CACHE) +/* add one to session reference count + * return WOFLSSL_SUCCESS on success and WOLFSSL_FAILURE on error */ +int wolfSSL_SESSION_up_ref(WOLFSSL_SESSION* session) +{ + if (session == NULL) + return WOLFSSL_FAILURE; + + if (wc_LockMutex(&session->refMutex) != 0) { + WOLFSSL_MSG("Failed to lock session mutex"); + } + session->refCount++; + wc_UnLockMutex(&session->refMutex); + return WOLFSSL_SUCCESS; +} + + WOLFSSL_SESSION* wolfSSL_SESSION_dup(WOLFSSL_SESSION* session) { #ifdef HAVE_EXT_CACHE @@ -23939,7 +23955,10 @@ unsigned long wolfSSL_ERR_peek_error(void) int wolfSSL_ERR_GET_LIB(unsigned long err) { - switch (err) { + unsigned long value; + + value = (err & 0xFFFFFFL); + switch (value) { case PEM_R_NO_START_LINE: case PEM_R_PROBLEMS_GETTING_PASSWORD: case PEM_R_BAD_PASSWORD_READ: diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 1aeec5125..16e8f533a 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -3154,6 +3154,8 @@ struct WOLFSSL_SESSION { #ifdef OPENSSL_EXTRA byte sessionCtxSz; /* sessionCtx length */ byte sessionCtx[ID_LEN]; /* app specific context id */ + wolfSSL_Mutex refMutex; /* ref count mutex */ + int refCount; /* reference count */ #endif #ifdef WOLFSSL_TLS13 word16 namedGroup; diff --git a/wolfssl/openssl/ssl.h b/wolfssl/openssl/ssl.h index 1e97d4550..5f0e3c12c 100644 --- a/wolfssl/openssl/ssl.h +++ b/wolfssl/openssl/ssl.h @@ -302,6 +302,7 @@ typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS; #define SSL_set_connect_state wolfSSL_set_connect_state #define SSL_set_accept_state wolfSSL_set_accept_state #define SSL_session_reused wolfSSL_session_reused +#define SSL_SESSION_up_ref wolfSSL_SESSION_up_ref #define SSL_SESSION_dup wolfSSL_SESSION_dup #define SSL_SESSION_free wolfSSL_SESSION_free #define SSL_is_init_finished wolfSSL_is_init_finished diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 551b68aa1..c90e7f5b2 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -1153,6 +1153,7 @@ WOLFSSL_API int wolfSSL_set_session_id_context(WOLFSSL*, const unsigned char*, WOLFSSL_API void wolfSSL_set_connect_state(WOLFSSL*); WOLFSSL_API void wolfSSL_set_accept_state(WOLFSSL*); WOLFSSL_API int wolfSSL_session_reused(WOLFSSL*); +WOLFSSL_API int wolfSSL_SESSION_up_ref(WOLFSSL_SESSION* session); WOLFSSL_API WOLFSSL_SESSION* wolfSSL_SESSION_dup(WOLFSSL_SESSION* session); WOLFSSL_API void wolfSSL_SESSION_free(WOLFSSL_SESSION* session); WOLFSSL_API int wolfSSL_is_init_finished(WOLFSSL*);