From: Gunnar Beutner Date: Mon, 1 Feb 2016 13:50:18 +0000 (+0100) Subject: Fix deadlock in HttpClientConnection::DataAvailableHandler X-Git-Tag: v2.5.0~567 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ec050dd2a721028847ecc47ebbf54ebf74ace86d;p=icinga2 Fix deadlock in HttpClientConnection::DataAvailableHandler refs #11014 --- diff --git a/lib/remote/httpclientconnection.cpp b/lib/remote/httpclientconnection.cpp index 9bad381d9..84b66d420 100644 --- a/lib/remote/httpclientconnection.cpp +++ b/lib/remote/httpclientconnection.cpp @@ -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 HttpClientConnection::NewRequest(void)