From 686446584c878b9ffa889eec17a1b29099740582 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 6 Nov 2013 18:54:01 +0100 Subject: [PATCH] Livestatus: Fix crash when socket exception is thrown during query reponse. Fixes #4619 --- components/livestatus/query.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/components/livestatus/query.cpp b/components/livestatus/query.cpp index 96ed9e9c0..f6d4ebb5c 100644 --- a/components/livestatus/query.cpp +++ b/components/livestatus/query.cpp @@ -477,8 +477,16 @@ void Query::SendResponse(const Stream::Ptr& stream, int code, const String& data if (m_ResponseHeader == "fixed16") PrintFixed16(stream, code, data); - if (m_ResponseHeader == "fixed16" || code == LivestatusErrorOK) - stream->Write(data.CStr(), data.GetLength()); + if (m_ResponseHeader == "fixed16" || code == LivestatusErrorOK) { + try { + stream->Write(data.CStr(), data.GetLength()); + } catch (const std::exception& ex) { + std::ostringstream info; + info << "Exception thrown while writing to the livestatus socket: " << std::endl + << boost::diagnostic_information(ex); + Log(LogCritical, "livestatus", info.str()); + } + } } void Query::PrintFixed16(const Stream::Ptr& stream, int code, const String& data) @@ -490,7 +498,14 @@ void Query::PrintFixed16(const Stream::Ptr& stream, int code, const String& data String header = sCode + String(16 - 3 - sLength.GetLength() - 1, ' ') + sLength + m_Separators[0]; - stream->Write(header.CStr(), header.GetLength()); + try { + stream->Write(header.CStr(), header.GetLength()); + } catch (const std::exception& ex) { + std::ostringstream info; + info << "Exception thrown while writing to the livestatus socket: " << std::endl + << boost::diagnostic_information(ex); + Log(LogCritical, "livestatus", info.str()); + } } bool Query::Execute(const Stream::Ptr& stream)