Merge pull request #3562 from SparkiDev/session_mutex

SESSION mutex: copying a session overwrote mutex
pull/3544/head
toddouska 2020-12-15 08:50:57 -08:00 committed by GitHub
commit f362c6ecf5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 26 additions and 9 deletions

View File

@ -19893,8 +19893,9 @@ int wolfSSL_session_reused(WOLFSSL* ssl)
} }
#if defined(OPENSSL_EXTRA) || defined(HAVE_EXT_CACHE) #if defined(OPENSSL_EXTRA) || defined(HAVE_EXT_CACHE)
/* return a new malloc'd session with default settings on success */ /* return a new malloc'd session with default settings on success */
WOLFSSL_SESSION* wolfSSL_SESSION_new(void) static WOLFSSL_SESSION* NewSession(void)
{ {
WOLFSSL_SESSION* ret = NULL; WOLFSSL_SESSION* ret = NULL;
@ -19902,18 +19903,27 @@ WOLFSSL_SESSION* wolfSSL_SESSION_new(void)
DYNAMIC_TYPE_OPENSSL); DYNAMIC_TYPE_OPENSSL);
if (ret != NULL) { if (ret != NULL) {
XMEMSET(ret, 0, sizeof(WOLFSSL_SESSION)); XMEMSET(ret, 0, sizeof(WOLFSSL_SESSION));
#ifdef OPENSSL_EXTRA
if (wc_InitMutex(&ret->refMutex) != 0) {
WOLFSSL_MSG("Error setting up session reference mutex");
XFREE(ret, NULL, DYNAMIC_TYPE_OPENSSL);
return NULL;
}
#endif
ret->isAlloced = 1; ret->isAlloced = 1;
} }
return ret; return ret;
} }
WOLFSSL_SESSION* wolfSSL_SESSION_new(void)
{
WOLFSSL_SESSION* ret = NewSession();
if (ret != NULL) {
#ifdef OPENSSL_EXTRA
if (wc_InitMutex(&ret->refMutex) != 0) {
WOLFSSL_MSG("Error setting up session reference mutex");
XFREE(ret, NULL, DYNAMIC_TYPE_OPENSSL);
return NULL;
}
}
#endif
return ret;
}
/* add one to session reference count /* add one to session reference count
* return WOFLSSL_SUCCESS on success and WOLFSSL_FAILURE on error */ * return WOFLSSL_SUCCESS on success and WOLFSSL_FAILURE on error */
@ -19949,10 +19959,17 @@ WOLFSSL_SESSION* wolfSSL_SESSION_dup(WOLFSSL_SESSION* session)
} }
#endif #endif
copy = wolfSSL_SESSION_new(); copy = NewSession();
if (copy != NULL) { if (copy != NULL) {
XMEMCPY(copy, session, sizeof(WOLFSSL_SESSION)); XMEMCPY(copy, session, sizeof(WOLFSSL_SESSION));
copy->isAlloced = 1; copy->isAlloced = 1;
#ifdef OPENSSL_EXTRA
if (wc_InitMutex(&copy->refMutex) != 0) {
WOLFSSL_MSG("Error setting up session reference mutex");
XFREE(copy, NULL, DYNAMIC_TYPE_OPENSSL);
return NULL;
}
#endif
#ifdef HAVE_SESSION_TICKET #ifdef HAVE_SESSION_TICKET
if (session->isDynamic) { if (session->isDynamic) {
copy->ticket = (byte*)XMALLOC(session->ticketLen, NULL, copy->ticket = (byte*)XMALLOC(session->ticketLen, NULL,