Fix null ptr dereference in HttpServerConnection::ProcessMessageAsync

This commit is contained in:
Gunnar Beutner 2018-02-28 11:07:19 +01:00
parent 6400a300cd
commit 6e7421eab0
3 changed files with 16 additions and 7 deletions

View 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;
}

View 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 HttpRequest& m_Request;
const HttpRequest *m_Request;
Stream::Ptr m_Stream;
FIFO::Ptr m_Body;
std::vector<String> m_Headers;

View 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) {