]> granicus.if.org Git - icinga2/commitdiff
Ensure that HttpServerConnections are properly closed
authorGunnar Beutner <gunnar@beutner.name>
Wed, 13 Jan 2016 09:30:38 +0000 (10:30 +0100)
committerGunnar Beutner <gunnar@beutner.name>
Wed, 13 Jan 2016 09:30:38 +0000 (10:30 +0100)
fixes #10655

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

index e4b69aeb3bb38dc305341faa1711ffca3ad4fa67..55d97eb1e9a4c6a4e788fd06a280c754025cae98 100644 (file)
@@ -218,9 +218,6 @@ void TlsStream::OnEvent(int revents)
                case SSL_ERROR_ZERO_RETURN:
                        lock.unlock();
 
-                       if (IsHandlingEvents())
-                               SignalDataAvailable();
-
                        Close();
 
                        break;
@@ -237,9 +234,6 @@ void TlsStream::OnEvent(int revents)
 
                        lock.unlock();
 
-                       if (IsHandlingEvents())
-                               SignalDataAvailable();
-
                        Close();
 
                        break;
@@ -316,13 +310,17 @@ void TlsStream::Shutdown(void)
  */
 void TlsStream::Close(void)
 {
+       if (!m_Eof) {
+               m_Eof = true;
+               SignalDataAvailable();
+       }
+
        Stream::Close();
 
        SocketEvents::Unregister();
 
        boost::mutex::scoped_lock lock(m_Mutex);
 
-       m_Eof = true;
 
        if (!m_SSL)
                return;
index 2a857aee9eb208997b303153d41f8e103927c0c2..3b533ca8bbb64a57a9e3db00fb300eb687ca801a 100644 (file)
@@ -206,7 +206,12 @@ void HttpServerConnection::DataAvailableHandler(void)
                    << "Error while reading Http request: " << DiagnosticInformation(ex);
 
                Disconnect();
+
+               return;
        }
+
+       if (m_Stream->IsEof())
+               Disconnect();
 }
 
 void HttpServerConnection::CheckLiveness(void)
index 0a095c9fdfc8412050a6ed2dc3b4edec66136823..ae514dfabc50eb3aebcc7bc9239a0d31f4dd0d5f 100644 (file)
@@ -202,7 +202,12 @@ void JsonRpcConnection::DataAvailableHandler(void)
                    << "': " << DiagnosticInformation(ex);
 
                Disconnect();
+
+               return;
        }
+
+       if (m_Stream->IsEof())
+               Disconnect();
 }
 
 Value SetLogPositionHandler(const MessageOrigin::Ptr& origin, const Dictionary::Ptr& params)