From 3c6ca2957bbcb6c98035408408c0d2ae76a90b68 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Sun, 15 Feb 2015 18:50:25 +0100 Subject: [PATCH] Fix a crash in SocketEvents::OnEvent fixes #8446 --- lib/base/socketevents.cpp | 14 ++++++++++++-- lib/base/tlsstream.cpp | 5 +++++ lib/base/tlsstream.hpp | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/base/socketevents.cpp b/lib/base/socketevents.cpp index 26c6200a2..64731855e 100644 --- a/lib/base/socketevents.cpp +++ b/lib/base/socketevents.cpp @@ -153,11 +153,13 @@ SocketEvents::SocketEvents(const Socket::Ptr& socket) SocketEvents::~SocketEvents(void) { - Unregister(); + ASSERT(m_FD == INVALID_SOCKET); } void SocketEvents::Register(void) { + ASSERT(m_FD != INVALID_SOCKET); + SocketEventDescriptor desc; desc.Events = 0; desc.EventInterface = this; @@ -165,6 +167,8 @@ void SocketEvents::Register(void) { boost::mutex::scoped_lock lock(l_SocketIOMutex); + ASSERT(l_SocketIOSockets.find(m_FD) == l_SocketIOSockets.end()); + l_SocketIOSockets[m_FD] = desc; } @@ -173,17 +177,23 @@ void SocketEvents::Register(void) void SocketEvents::Unregister(void) { + if (m_FD == INVALID_SOCKET) + return; + { boost::mutex::scoped_lock lock(l_SocketIOMutex); l_SocketIOSockets.erase(m_FD); + m_FD = INVALID_SOCKET; } - /* There's no need to wake up the I/O thread here. */ + WakeUpThread(); } void SocketEvents::ChangeEvents(int events) { + ASSERT(m_FD != INVALID_SOCKET); + { boost::mutex::scoped_lock lock(l_SocketIOMutex); diff --git a/lib/base/tlsstream.cpp b/lib/base/tlsstream.cpp index 0eb98783a..9057d902e 100644 --- a/lib/base/tlsstream.cpp +++ b/lib/base/tlsstream.cpp @@ -77,6 +77,11 @@ TlsStream::TlsStream(const Socket::Ptr& socket, ConnectionRole role, const boost SSL_set_connect_state(m_SSL.get()); } +TlsStream::~TlsStream(void) +{ + SocketEvents::Unregister(); +} + int TlsStream::ValidateCertificate(int preverify_ok, X509_STORE_CTX *ctx) { SSL *ssl = static_cast(X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx())); diff --git a/lib/base/tlsstream.hpp b/lib/base/tlsstream.hpp index e885a818b..10c4c58bd 100644 --- a/lib/base/tlsstream.hpp +++ b/lib/base/tlsstream.hpp @@ -50,6 +50,7 @@ public: DECLARE_PTR_TYPEDEFS(TlsStream); TlsStream(const Socket::Ptr& socket, ConnectionRole role, const boost::shared_ptr& sslContext); + ~TlsStream(void); boost::shared_ptr GetClientCertificate(void) const; boost::shared_ptr GetPeerCertificate(void) const;