From: Gunnar Beutner Date: Wed, 28 Feb 2018 10:07:19 +0000 (+0100) Subject: Fix null ptr dereference in HttpServerConnection::ProcessMessageAsync X-Git-Tag: v2.8.2~15 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6e7421eab079a13d7732037240dfae58003b4523;p=icinga2 Fix null ptr dereference in HttpServerConnection::ProcessMessageAsync --- diff --git a/lib/remote/httpresponse.cpp b/lib/remote/httpresponse.cpp index fd7578ed0..09076ed8c 100644 --- a/lib/remote/httpresponse.cpp +++ b/lib/remote/httpresponse.cpp @@ -29,7 +29,7 @@ using namespace icinga; HttpResponse::HttpResponse(const Stream::Ptr& stream, const HttpRequest& request) - : Complete(false), m_State(HttpResponseStart), m_Request(request), m_Stream(stream) + : Complete(false), m_State(HttpResponseStart), m_Request(&request), m_Stream(stream) { } void HttpResponse::SetStatus(int code, const String& message) @@ -44,7 +44,7 @@ void HttpResponse::SetStatus(int code, const String& message) String status = "HTTP/"; - if (m_Request.ProtocolVersion == HttpVersion10) + if (m_Request->ProtocolVersion == HttpVersion10) status += "1.0"; else status += "1.1"; @@ -64,7 +64,7 @@ void HttpResponse::AddHeader(const String& key, const String& value) void HttpResponse::FinishHeaders(void) { if (m_State == HttpResponseHeaders) { - if (m_Request.ProtocolVersion == HttpVersion11) + if (m_Request->ProtocolVersion == HttpVersion11) AddHeader("Transfer-Encoding", "chunked"); AddHeader("Server", "Icinga/" + Application::GetAppVersion()); @@ -81,7 +81,7 @@ void HttpResponse::WriteBody(const char *data, size_t count) { ASSERT(m_State == HttpResponseHeaders || m_State == HttpResponseBody); - if (m_Request.ProtocolVersion == HttpVersion10) { + if (m_Request->ProtocolVersion == HttpVersion10) { if (!m_Body) m_Body = new FIFO(); @@ -97,7 +97,7 @@ void HttpResponse::Finish(void) { ASSERT(m_State != HttpResponseEnd); - if (m_Request.ProtocolVersion == HttpVersion10) { + if (m_Request->ProtocolVersion == HttpVersion10) { if (m_Body) AddHeader("Content-Length", Convert::ToString(m_Body->GetAvailableBytes())); @@ -115,7 +115,7 @@ void HttpResponse::Finish(void) m_State = HttpResponseEnd; - if (m_Request.ProtocolVersion == HttpVersion10 || m_Request.Headers->Get("connection") == "close") + if (m_Request->ProtocolVersion == HttpVersion10 || m_Request->Headers->Get("connection") == "close") m_Stream->Shutdown(); } @@ -267,3 +267,8 @@ bool HttpResponse::IsPeerConnected(void) const { return !m_Stream->IsEof(); } + +void HttpResponse::RebindRequest(const HttpRequest& request) +{ + m_Request = &request; +} diff --git a/lib/remote/httpresponse.hpp b/lib/remote/httpresponse.hpp index da6afd66b..6137a65f5 100644 --- a/lib/remote/httpresponse.hpp +++ b/lib/remote/httpresponse.hpp @@ -65,10 +65,12 @@ public: bool IsPeerConnected(void) const; + void RebindRequest(const HttpRequest& request); + private: HttpResponseState m_State; boost::shared_ptr m_ChunkContext; - const HttpRequest& m_Request; + const HttpRequest *m_Request; Stream::Ptr m_Stream; FIFO::Ptr m_Body; std::vector m_Headers; diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index d5837a856..550778751 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -316,6 +316,8 @@ bool HttpServerConnection::ManageHeaders(HttpResponse& response) void HttpServerConnection::ProcessMessageAsync(HttpRequest& request, HttpResponse& response, const ApiUser::Ptr& user) { + response.RebindRequest(request); + try { HttpHandler::ProcessRequest(user, request, response); } catch (const std::exception& ex) {