From a95981f3dae2da486784a1d3c7005ab43822b9b4 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Mon, 16 Jul 2012 23:55:08 +0900 Subject: [PATCH] shrpx: Check the fatal error inside downstream http-parser callback --- examples/shrpx_downstream.cc | 12 ++++++------ examples/shrpx_https_upstream.cc | 15 ++++++++++++--- examples/shrpx_spdy_upstream.cc | 9 +++++++-- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/examples/shrpx_downstream.cc b/examples/shrpx_downstream.cc index 7f926f1..5cf3beb 100644 --- a/examples/shrpx_downstream.cc +++ b/examples/shrpx_downstream.cc @@ -521,7 +521,10 @@ int htp_hdrs_completecb(http_parser *htp) downstream->set_response_minor(htp->http_minor); downstream->set_response_connection_close(!http_should_keep_alive(htp)); downstream->set_response_state(Downstream::HEADER_COMPLETE); - downstream->get_upstream()->on_downstream_header_complete(downstream); + if(downstream->get_upstream()->on_downstream_header_complete(downstream) + != 0) { + return -1; + } if(downstream->tunnel_established()) { downstream->get_downstream_connection()->set_tunneling_timeout(); @@ -578,9 +581,8 @@ int htp_bodycb(http_parser *htp, const char *data, size_t len) Downstream *downstream; downstream = reinterpret_cast(htp->data); - downstream->get_upstream()->on_downstream_body + return downstream->get_upstream()->on_downstream_body (downstream, reinterpret_cast(data), len); - return 0; } } // namespace @@ -591,9 +593,7 @@ int htp_msg_completecb(http_parser *htp) downstream = reinterpret_cast(htp->data); downstream->set_response_state(Downstream::MSG_COMPLETE); - downstream->get_upstream()->on_downstream_body_complete(downstream); - - return 0; + return downstream->get_upstream()->on_downstream_body_complete(downstream); } } // namespace diff --git a/examples/shrpx_https_upstream.cc b/examples/shrpx_https_upstream.cc index 876c478..6e9e45e 100644 --- a/examples/shrpx_https_upstream.cc +++ b/examples/shrpx_https_upstream.cc @@ -591,7 +591,10 @@ int HttpsUpstream::on_downstream_header_complete(Downstream *downstream) LOG(INFO) << "Upstream https response headers\n" << hdrs; } evbuffer *output = bufferevent_get_output(handler_->get_bev()); - evbuffer_add(output, hdrs.c_str(), hdrs.size()); + if(evbuffer_add(output, hdrs.c_str(), hdrs.size()) != 0) { + LOG(FATAL) << "evbuffer_add() failed"; + return -1; + } return 0; } @@ -604,7 +607,10 @@ int HttpsUpstream::on_downstream_body(Downstream *downstream, char chunk_size_hex[16]; rv = snprintf(chunk_size_hex, sizeof(chunk_size_hex), "%X\r\n", static_cast(len)); - evbuffer_add(output, chunk_size_hex, rv); + if(evbuffer_add(output, chunk_size_hex, rv) != 0) { + LOG(FATAL) << "evbuffer_add() failed"; + return -1; + } } evbuffer_add(output, data, len); if(downstream->get_chunked_response()) { @@ -617,7 +623,10 @@ int HttpsUpstream::on_downstream_body_complete(Downstream *downstream) { if(downstream->get_chunked_response()) { evbuffer *output = bufferevent_get_output(handler_->get_bev()); - evbuffer_add(output, "0\r\n\r\n", 5); + if(evbuffer_add(output, "0\r\n\r\n", 5) != 0) { + LOG(FATAL) << "evbuffer_add() failed"; + return -1; + } } if(ENABLE_LOG) { LOG(INFO) << "Downstream on_downstream_body_complete"; diff --git a/examples/shrpx_spdy_upstream.cc b/examples/shrpx_spdy_upstream.cc index 54b7ac6..f77d3c1 100644 --- a/examples/shrpx_spdy_upstream.cc +++ b/examples/shrpx_spdy_upstream.cc @@ -699,8 +699,13 @@ int SpdyUpstream::on_downstream_header_complete(Downstream *downstream) data_prd.source.ptr = downstream; data_prd.read_callback = spdy_data_read_callback; - spdylay_submit_response(session_, downstream->get_stream_id(), nv, - &data_prd); + int rv; + rv = spdylay_submit_response(session_, downstream->get_stream_id(), nv, + &data_prd); + if(rv != 0) { + LOG(FATAL) << "spdylay_submit_response() failed"; + return -1; + } delete [] nv; return 0; }