]> granicus.if.org Git - icinga2/commitdiff
Fix null ptr dereference in HttpServerConnection::ProcessMessageAsync
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:54:48 +0000 (11:54 +0100)
lib/remote/httpresponse.cpp
lib/remote/httpresponse.hpp
lib/remote/httpserverconnection.cpp

index fd7578ed010814da9e411623601d2dd9b384960e..09076ed8c60060b527cbbac29df06168aae6c808 100644 (file)
@@ -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;
+}
index da6afd66b97e9c81ce73ced1418fce3fe459da74..6137a65f511dbd50a40ab2641a4869559f3d58c2 100644 (file)
@@ -65,10 +65,12 @@ public:
 
        bool IsPeerConnected(void) const;
 
+       void RebindRequest(const HttpRequest& request);
+
 private:
        HttpResponseState m_State;
        boost::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 d5837a8560dab469fafad55c24db71226788389a..550778751dbc856cf7be030b3e5c4e7235da5343 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) {