]> granicus.if.org Git - icinga2/commitdiff
Fix deadlock in HttpClientConnection::DataAvailableHandler
authorGunnar Beutner <gunnar@beutner.name>
Mon, 1 Feb 2016 13:50:18 +0000 (14:50 +0100)
committerGunnar Beutner <gunnar@beutner.name>
Mon, 1 Feb 2016 13:50:18 +0000 (14:50 +0100)
refs #11014

lib/remote/httpclientconnection.cpp

index 9bad381d9fab040220549d859256793dfddeaffa..84b66d4209f47b6c64103696bb9646da80a57a44 100644 (file)
@@ -137,24 +137,28 @@ bool HttpClientConnection::ProcessMessage(void)
 
 void HttpClientConnection::DataAvailableHandler(const Stream::Ptr& stream)
 {
-       boost::mutex::scoped_lock lock(m_DataHandlerMutex);
-
        ASSERT(stream == m_Stream);
 
-       try {
-               while (ProcessMessage())
-                       ; /* empty loop body */
-       } catch (const std::exception& ex) {
-               Log(LogWarning, "HttpClientConnection")
-                   << "Error while reading Http response: " << DiagnosticInformation(ex);
+       bool close = false;
 
-               Disconnect();
-       }
+       if (!m_Stream->IsEof()) {
+               boost::mutex::scoped_lock lock(m_DataHandlerMutex);
 
-       if (m_Context.Eof) {
-               Log(LogWarning, "HttpClientConnection", "Encountered unexpected EOF while reading Http response.");
+               try {
+                       while (ProcessMessage())
+                               ; /* empty loop body */
+               } catch (const std::exception& ex) {
+                       Log(LogWarning, "HttpClientConnection")
+                           << "Error while reading Http response: " << DiagnosticInformation(ex);
+
+                       close = true;
+                       Disconnect();
+               }
+       } else
+               close = true;
+
+       if (close)
                m_Stream->Close();
-       }
 }
 
 boost::shared_ptr<HttpRequest> HttpClientConnection::NewRequest(void)