From deac316a45a2a9befd913bf2d476fdfd45596ead Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 1 Feb 2016 08:35:55 +0100 Subject: [PATCH] Fix deadlock in {HttpServerConnection,JsonRpcConnection}::DataAvailableHandler refs #11014 --- lib/remote/httpserverconnection.cpp | 28 ++++++++++++++++------------ lib/remote/jsonrpcconnection.cpp | 29 +++++++++++++++++------------ 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index 3b533ca8b..409b6f26e 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -78,7 +78,8 @@ void HttpServerConnection::Disconnect(void) ApiListener::Ptr listener = ApiListener::GetInstance(); listener->RemoveHttpClient(this); - m_Stream->Shutdown(); + if (!m_Stream->IsEof()) + m_Stream->Shutdown(); } bool HttpServerConnection::ProcessMessage(void) @@ -196,21 +197,24 @@ void HttpServerConnection::ProcessMessageAsync(HttpRequest& request) void HttpServerConnection::DataAvailableHandler(void) { - boost::mutex::scoped_lock lock(m_DataHandlerMutex); + bool close = false; - try { - while (ProcessMessage()) - ; /* empty loop body */ - } catch (const std::exception& ex) { - Log(LogWarning, "HttpServerConnection") - << "Error while reading Http request: " << DiagnosticInformation(ex); + if (!m_Stream->IsEof()) { + boost::mutex::scoped_lock lock(m_DataHandlerMutex); - Disconnect(); + try { + while (ProcessMessage()) + ; /* empty loop body */ + } catch (const std::exception& ex) { + Log(LogWarning, "HttpServerConnection") + << "Error while reading Http request: " << DiagnosticInformation(ex); - return; - } + close = true; + } + } else + close = true; - if (m_Stream->IsEof()) + if (close) Disconnect(); } diff --git a/lib/remote/jsonrpcconnection.cpp b/lib/remote/jsonrpcconnection.cpp index 00c953c44..b3cf8dbad 100644 --- a/lib/remote/jsonrpcconnection.cpp +++ b/lib/remote/jsonrpcconnection.cpp @@ -227,22 +227,27 @@ bool JsonRpcConnection::ProcessMessage(void) void JsonRpcConnection::DataAvailableHandler(void) { - boost::mutex::scoped_lock lock(m_DataHandlerMutex); + bool close = false; - try { - while (ProcessMessage()) - ; /* empty loop body */ - } catch (const std::exception& ex) { - Log(LogWarning, "JsonRpcConnection") - << "Error while reading JSON-RPC message for identity '" << m_Identity - << "': " << DiagnosticInformation(ex); + if (!m_Stream->IsEof()) { + boost::mutex::scoped_lock lock(m_DataHandlerMutex); - Disconnect(); + try { + while (ProcessMessage()) + ; /* empty loop body */ + } catch (const std::exception& ex) { + Log(LogWarning, "JsonRpcConnection") + << "Error while reading JSON-RPC message for identity '" << m_Identity + << "': " << DiagnosticInformation(ex); - return; - } + Disconnect(); - if (m_Stream->IsEof()) + return; + } + } else + close = true; + + if (close) Disconnect(); }