]> granicus.if.org Git - icinga2/commitdiff
Fix a crash in SocketEvents::OnEvent
authorGunnar Beutner <gunnar@beutner.name>
Sun, 15 Feb 2015 17:50:25 +0000 (18:50 +0100)
committerGunnar Beutner <gunnar@beutner.name>
Sun, 15 Feb 2015 17:50:25 +0000 (18:50 +0100)
fixes #8446

lib/base/socketevents.cpp
lib/base/tlsstream.cpp
lib/base/tlsstream.hpp

index 26c6200a229ee2a68c574b3745369c069cf1eed8..64731855e54a863da6cbc00b381cfd5cf8cc6c93 100644 (file)
@@ -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);
 
index 0eb98783a19e3e535e537be810dce38ab96baea5..9057d902e150825a33ba8063a482cbe2c65bf0e7 100644 (file)
@@ -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<SSL *>(X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx()));
index e885a818bb116f45fa3f32c1b4502b90379d9f9b..10c4c58bd9ab6b12082f3a946cb97ae6fcf72a6a 100644 (file)
@@ -50,6 +50,7 @@ public:
        DECLARE_PTR_TYPEDEFS(TlsStream);
 
        TlsStream(const Socket::Ptr& socket, ConnectionRole role, const boost::shared_ptr<SSL_CTX>& sslContext);
+       ~TlsStream(void);
 
        boost::shared_ptr<X509> GetClientCertificate(void) const;
        boost::shared_ptr<X509> GetPeerCertificate(void) const;