Fix a crash in TlsStream::Close

fixes #8537
This commit is contained in:
Gunnar Beutner 2015-02-25 14:35:49 +01:00
parent 49c5c42945
commit aef5bc2f3a
2 changed files with 13 additions and 6 deletions

View File

@ -40,7 +40,7 @@ bool I2_EXPORT TlsStream::m_SSLIndexInitialized = false;
* @param sslContext The SSL context for the client. * @param sslContext The SSL context for the client.
*/ */
TlsStream::TlsStream(const Socket::Ptr& socket, ConnectionRole role, const boost::shared_ptr<SSL_CTX>& sslContext) TlsStream::TlsStream(const Socket::Ptr& socket, ConnectionRole role, const boost::shared_ptr<SSL_CTX>& 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_ErrorOccurred(false), m_Socket(socket), m_Role(role), m_SendQ(new FIFO()), m_RecvQ(new FIFO()),
m_CurrentAction(TlsActionNone), m_Retry(false) m_CurrentAction(TlsActionNone), m_Retry(false)
{ {
@ -125,6 +125,9 @@ void TlsStream::OnEvent(int revents)
boost::mutex::scoped_lock lock(m_Mutex); boost::mutex::scoped_lock lock(m_Mutex);
if (!m_SSL)
return;
char buffer[512]; char buffer[512];
if (m_CurrentAction == TlsActionNone) { if (m_CurrentAction == TlsActionNone) {
@ -204,7 +207,7 @@ void TlsStream::OnEvent(int revents)
break; break;
case SSL_ERROR_ZERO_RETURN: case SSL_ERROR_ZERO_RETURN:
Unregister(); SocketEvents::Unregister();
m_SSL.reset(); m_SSL.reset();
m_Socket->Close(); m_Socket->Close();
@ -215,7 +218,7 @@ void TlsStream::OnEvent(int revents)
break; break;
default: default:
Unregister(); SocketEvents::Unregister();
m_SSL.reset(); m_SSL.reset();
m_Socket->Close(); m_Socket->Close();
@ -282,11 +285,16 @@ void TlsStream::Write(const void *buffer, size_t count)
void TlsStream::Close(void) void TlsStream::Close(void)
{ {
boost::mutex::scoped_lock lock(m_Mutex); boost::mutex::scoped_lock lock(m_Mutex);
if (!m_SSL)
return;
(void) SSL_shutdown(m_SSL.get()); (void) SSL_shutdown(m_SSL.get());
m_SSL.reset();
m_Socket->Close(); m_Socket->Close();
m_CloseOK = true; m_Eof = true;
m_CV.notify_all();
} }
bool TlsStream::IsEof(void) const bool TlsStream::IsEof(void) const

View File

@ -75,7 +75,6 @@ private:
mutable boost::condition_variable m_CV; mutable boost::condition_variable m_CV;
bool m_HandshakeOK; bool m_HandshakeOK;
bool m_VerifyOK; bool m_VerifyOK;
bool m_CloseOK;
int m_ErrorCode; int m_ErrorCode;
bool m_ErrorOccurred; bool m_ErrorOccurred;