]> granicus.if.org Git - icinga2/commitdiff
Fix null ptr dereference in HttpServerConnection::ProcessMessageAsync 6132/head
authorGunnar Beutner <gunnar.beutner@icinga.com>
Wed, 28 Feb 2018 10:07:19 +0000 (11:07 +0100)
committerGunnar Beutner <gunnar.beutner@icinga.com>
Wed, 28 Feb 2018 10:07:19 +0000 (11:07 +0100)
lib/remote/httpresponse.cpp
lib/remote/httpresponse.hpp
lib/remote/httpserverconnection.cpp

index 2b6c9e99f28bc51d78262f27d5da5e340abfc5b4..45ac25c817143546a391fbfd706b2b365e6ee358 100644 (file)
@@ -26,7 +26,7 @@
 using namespace icinga;
 
 HttpResponse::HttpResponse(Stream::Ptr stream, const HttpRequest& request)
-       : Complete(false), m_State(HttpResponseStart), m_Request(request), m_Stream(std::move(stream))
+       : Complete(false), m_State(HttpResponseStart), m_Request(&request), m_Stream(std::move(stream))
 { }
 
 void HttpResponse::SetStatus(int code, const String& message)
@@ -41,7 +41,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";
@@ -61,7 +61,7 @@ void HttpResponse::AddHeader(const String& key, const String& value)
 void HttpResponse::FinishHeaders()
 {
        if (m_State == HttpResponseHeaders) {
-               if (m_Request.ProtocolVersion == HttpVersion11)
+               if (m_Request->ProtocolVersion == HttpVersion11)
                        AddHeader("Transfer-Encoding", "chunked");
 
                AddHeader("Server", "Icinga/" + Application::GetAppVersion());
@@ -78,7 +78,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();
 
@@ -94,7 +94,7 @@ void HttpResponse::Finish()
 {
        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()));
 
@@ -112,7 +112,7 @@ void HttpResponse::Finish()
 
        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();
 }
 
@@ -263,3 +263,8 @@ bool HttpResponse::IsPeerConnected() const
 {
        return !m_Stream->IsEof();
 }
+
+void HttpResponse::RebindRequest(const HttpRequest& request)
+{
+       m_Request = &request;
+}
index 5ce267bf35a12f64eb2d376b0c2dae33a50fa437..5021bbbde3de883d9435846bb6cde09b18a1f7bd 100644 (file)
@@ -65,10 +65,12 @@ public:
 
        bool IsPeerConnected() const;
 
+       void RebindRequest(const HttpRequest& request);
+
 private:
        HttpResponseState m_State;
        std::shared_ptr<ChunkReadContext> m_ChunkContext;
-       const HttpRequestm_Request;
+       const HttpRequest *m_Request;
        Stream::Ptr m_Stream;
        FIFO::Ptr m_Body;
        std::vector<String> m_Headers;
index 122209f62da4b14cdbbb1ccc132e4660a1a0f41e..177ea40792cafd2fa2c8153602a3686e10c040b0 100644 (file)
@@ -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) {