]> granicus.if.org Git - icinga2/commitdiff
Fix memory/thread leak in the HttpServerConnection class
authorGunnar Beutner <gunnar@beutner.name>
Wed, 3 Feb 2016 08:54:31 +0000 (09:54 +0100)
committerGunnar Beutner <gunnar@beutner.name>
Wed, 3 Feb 2016 08:54:31 +0000 (09:54 +0100)
fixes #10655

lib/base/tlsstream.cpp
lib/remote/httpserverconnection.cpp

index 2f24a1106db0af4812cef7e1131275ac9cab62ad..f1248eee7d069263636d3c4893c74969efc59cb4 100644 (file)
@@ -189,7 +189,7 @@ void TlsStream::OnEvent(int revents)
                        VERIFY(!"Invalid TlsAction");
        }
 
-       if (rc < 0) {
+       if (rc <= 0) {
                int err = SSL_get_error(m_SSL.get(), rc);
 
                switch (err) {
@@ -208,7 +208,7 @@ void TlsStream::OnEvent(int revents)
 
                                Close();
 
-                               break;
+                               return;
                        default:
                                m_ErrorCode = ERR_peek_error();
                                m_ErrorOccurred = true;
@@ -224,7 +224,7 @@ void TlsStream::OnEvent(int revents)
 
                                Close();
 
-                               break;
+                               return;
                }
        }
 
@@ -242,11 +242,12 @@ void TlsStream::OnEvent(int revents)
 
                while (m_RecvQ->IsDataAvailable() && IsHandlingEvents())
                        SignalDataAvailable();
-
-               if (m_Shutdown && !m_SendQ->IsDataAvailable())
-                       Close();
        }
 
+       if (m_Shutdown && !m_SendQ->IsDataAvailable()) {
+               lock.unlock();
+               Close();
+       }
 }
 
 void TlsStream::HandleError(void) const
@@ -312,6 +313,7 @@ void TlsStream::Write(const void *buffer, size_t count)
 void TlsStream::Shutdown(void)
 {
        m_Shutdown = true;
+       ChangeEvents(POLLOUT);
 }
 
 /**
@@ -324,10 +326,13 @@ void TlsStream::Close(void)
 
 void TlsStream::CloseInternal(bool inDestructor)
 {
-       if (!m_Eof && !inDestructor) {
-               m_Eof = true;
+       if (m_Eof)
+               return;
+
+       m_Eof = true;
+
+       if (!inDestructor)
                SignalDataAvailable();
-       }
 
        SocketEvents::Unregister();
 
index 409b6f26e14528135e03674f3cfa6ea968096463..d78ced453df7cb9d0c6ab19571827f4a841e3da0 100644 (file)
@@ -78,8 +78,7 @@ void HttpServerConnection::Disconnect(void)
        ApiListener::Ptr listener = ApiListener::GetInstance();
        listener->RemoveHttpClient(this);
 
-       if (!m_Stream->IsEof())
-               m_Stream->Shutdown();
+       m_Stream->Shutdown();
 }
 
 bool HttpServerConnection::ProcessMessage(void)