]> 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>
Tue, 23 Feb 2016 08:38:23 +0000 (09:38 +0100)
fixes #10655

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

index be1977e5befcddb246ffbf7b8bdd6a0e3bd041f8..a431199f83b33738603aef27be0bd74556f3b163 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,9 +242,11 @@ 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();
        }
 }
 
@@ -311,6 +313,7 @@ void TlsStream::Write(const void *buffer, size_t count)
 void TlsStream::Shutdown(void)
 {
        m_Shutdown = true;
+       ChangeEvents(POLLOUT);
 }
 
 /**
@@ -318,10 +321,23 @@ void TlsStream::Shutdown(void)
  */
 void TlsStream::Close(void)
 {
+<<<<<<< HEAD
        if (!m_Eof) {
                m_Eof = true;
+=======
+       CloseInternal(false);
+}
+
+void TlsStream::CloseInternal(bool inDestructor)
+{
+       if (m_Eof)
+               return;
+
+       m_Eof = true;
+
+       if (!inDestructor)
+>>>>>>> 2dc385e... Fix memory/thread leak in the HttpServerConnection class
                SignalDataAvailable();
-       }
 
        Stream::Close();
 
index d857ed4bfa1086a733c664eb7d85fe25ca89ad26..4125a75abc2db88171d80062667f19b31b0f3d71 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)