From aef5bc2f3a9636158145281f6c6b3fa88f80f307 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 25 Feb 2015 14:35:49 +0100 Subject: [PATCH] Fix a crash in TlsStream::Close fixes #8537 --- lib/base/tlsstream.cpp | 18 +++++++++++++----- lib/base/tlsstream.hpp | 1 - 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/base/tlsstream.cpp b/lib/base/tlsstream.cpp index 9ff8fbd43..7cb08fbe2 100644 --- a/lib/base/tlsstream.cpp +++ b/lib/base/tlsstream.cpp @@ -40,7 +40,7 @@ bool I2_EXPORT TlsStream::m_SSLIndexInitialized = false; * @param sslContext The SSL context for the client. */ TlsStream::TlsStream(const Socket::Ptr& socket, ConnectionRole role, const boost::shared_ptr& sslContext) - : SocketEvents(socket, this), m_Eof(false), m_HandshakeOK(false), m_VerifyOK(true), m_CloseOK(false), m_ErrorCode(0), + : SocketEvents(socket, this), m_Eof(false), m_HandshakeOK(false), m_VerifyOK(true), m_ErrorCode(0), m_ErrorOccurred(false), m_Socket(socket), m_Role(role), m_SendQ(new FIFO()), m_RecvQ(new FIFO()), m_CurrentAction(TlsActionNone), m_Retry(false) { @@ -125,6 +125,9 @@ void TlsStream::OnEvent(int revents) boost::mutex::scoped_lock lock(m_Mutex); + if (!m_SSL) + return; + char buffer[512]; if (m_CurrentAction == TlsActionNone) { @@ -204,7 +207,7 @@ void TlsStream::OnEvent(int revents) break; case SSL_ERROR_ZERO_RETURN: - Unregister(); + SocketEvents::Unregister(); m_SSL.reset(); m_Socket->Close(); @@ -215,7 +218,7 @@ void TlsStream::OnEvent(int revents) break; default: - Unregister(); + SocketEvents::Unregister(); m_SSL.reset(); m_Socket->Close(); @@ -282,11 +285,16 @@ void TlsStream::Write(const void *buffer, size_t count) void TlsStream::Close(void) { boost::mutex::scoped_lock lock(m_Mutex); + + if (!m_SSL) + return; + (void) SSL_shutdown(m_SSL.get()); + m_SSL.reset(); + m_Socket->Close(); - m_CloseOK = true; - m_CV.notify_all(); + m_Eof = true; } bool TlsStream::IsEof(void) const diff --git a/lib/base/tlsstream.hpp b/lib/base/tlsstream.hpp index 80be2d917..c0c6907d3 100644 --- a/lib/base/tlsstream.hpp +++ b/lib/base/tlsstream.hpp @@ -75,7 +75,6 @@ private: mutable boost::condition_variable m_CV; bool m_HandshakeOK; bool m_VerifyOK; - bool m_CloseOK; int m_ErrorCode; bool m_ErrorOccurred; -- 2.49.0