From de74e2fb576f21627ddc7d9ec9bd9bd209547cab Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Sun, 28 Jun 2015 07:44:27 -0400 Subject: [PATCH] SecureSocket: * SSLdata_ is no longer destroyed and created in closeSocket(). * Adjusted handling of SSL context and method in initSSL() to prevent memory leaks. * The above changes prevent a bug where SSL certificates were lost after closeSocket() was called. --- Jupiter/SecureSocket.cpp | 33 ++++++++++++++++++++++++--------- Release/Jupiter.lib | Bin 277378 -> 277378 bytes 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/Jupiter/SecureSocket.cpp b/Jupiter/SecureSocket.cpp index c693cd1..819fb8a 100644 --- a/Jupiter/SecureSocket.cpp +++ b/Jupiter/SecureSocket.cpp @@ -91,8 +91,13 @@ void Jupiter::SecureSocket::closeSocket() if (Jupiter::SecureSocket::SSLdata_ != nullptr) { Jupiter::Socket::closeSocket(); - delete Jupiter::SecureSocket::SSLdata_; - Jupiter::SecureSocket::SSLdata_ = new Jupiter::SecureSocket::SSLData(); + if (Jupiter::SecureSocket::SSLdata_->handle != nullptr) + { + if (SSL_shutdown(Jupiter::SecureSocket::SSLdata_->handle) == 0) + SSL_shutdown(Jupiter::SecureSocket::SSLdata_->handle); + SSL_free(Jupiter::SecureSocket::SSLdata_->handle); + Jupiter::SecureSocket::SSLdata_->handle = nullptr; + } } } @@ -194,16 +199,26 @@ bool Jupiter::SecureSocket::initSSL() { SSL_load_error_strings(); SSL_library_init(); - Jupiter::SecureSocket::SSLdata_->method = translateEncryptionMethod(Jupiter::SecureSocket::SSLdata_->eMethod); - if (Jupiter::SecureSocket::SSLdata_->method == nullptr) return false; - Jupiter::SecureSocket::SSLdata_->context = SSL_CTX_new(Jupiter::SecureSocket::SSLdata_->method); + if (Jupiter::SecureSocket::SSLdata_->context == nullptr) { - ERR_print_errors_fp(stderr); - return false; + if (Jupiter::SecureSocket::SSLdata_->method == nullptr) + { + Jupiter::SecureSocket::SSLdata_->method = translateEncryptionMethod(Jupiter::SecureSocket::SSLdata_->eMethod); + if (Jupiter::SecureSocket::SSLdata_->method == nullptr) + return false; + } + + Jupiter::SecureSocket::SSLdata_->context = SSL_CTX_new(Jupiter::SecureSocket::SSLdata_->method); + if (Jupiter::SecureSocket::SSLdata_->context == nullptr) + { + ERR_print_errors_fp(stderr); + return false; + } + if (Jupiter::SecureSocket::SSLdata_->cert.isNotEmpty()) + loadCertificate(Jupiter::SecureSocket::SSLdata_->context, Jupiter::SecureSocket::SSLdata_->cert.c_str(), Jupiter::SecureSocket::SSLdata_->key.c_str()); } - if (Jupiter::SecureSocket::SSLdata_->cert.isNotEmpty()) - loadCertificate(Jupiter::SecureSocket::SSLdata_->context, Jupiter::SecureSocket::SSLdata_->cert.c_str(), Jupiter::SecureSocket::SSLdata_->key.c_str()); + Jupiter::SecureSocket::SSLdata_->handle = SSL_new(Jupiter::SecureSocket::SSLdata_->context); if (Jupiter::SecureSocket::SSLdata_->handle == nullptr) { diff --git a/Release/Jupiter.lib b/Release/Jupiter.lib index 827f9d474a249bc02c2b6dabac28a4b968cb3bb9..148ddd65c1c11a4684df2f4ecdc4f518b39418f7 100644 GIT binary patch delta 21912 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 DQHZ1p delta 22344 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