From 0288093caf2ca78713ac37bc6282480404849bda Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sun, 21 Apr 2019 00:07:11 +0900 Subject: [PATCH] Fix llhttp_get_error_pos usage It returns NULL if return value is HPE_OK. --- src/h2load_http1_session.cc | 7 +++++-- src/nghttp.cc | 8 +++++--- src/shrpx_http_downstream_connection.cc | 9 ++++++--- src/shrpx_https_upstream.cc | 7 +++++-- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/h2load_http1_session.cc b/src/h2load_http1_session.cc index eecebc4f..14e4d580 100644 --- a/src/h2load_http1_session.cc +++ b/src/h2load_http1_session.cc @@ -203,8 +203,11 @@ int Http1Session::submit_request() { int Http1Session::on_read(const uint8_t *data, size_t len) { auto htperr = llhttp_execute(&htp_, reinterpret_cast(data), len); - auto nread = static_cast( - reinterpret_cast(llhttp_get_error_pos(&htp_)) - data); + auto nread = htperr == HPE_OK + ? len + : static_cast(reinterpret_cast( + llhttp_get_error_pos(&htp_)) - + data); if (client_->worker->config->verbose) { std::cout.write(reinterpret_cast(data), nread); diff --git a/src/nghttp.cc b/src/nghttp.cc index 7605e483..81e7ebe9 100644 --- a/src/nghttp.cc +++ b/src/nghttp.cc @@ -1035,9 +1035,11 @@ int HttpClient::on_upgrade_read(const uint8_t *data, size_t len) { auto htperr = llhttp_execute(htp.get(), reinterpret_cast(data), len); - auto nread = static_cast( - reinterpret_cast(llhttp_get_error_pos(htp.get())) - - data); + auto nread = htperr == HPE_OK + ? len + : static_cast(reinterpret_cast( + llhttp_get_error_pos(htp.get())) - + data); if (config.verbose) { std::cout.write(reinterpret_cast(data), nread); diff --git a/src/shrpx_http_downstream_connection.cc b/src/shrpx_http_downstream_connection.cc index 70318eb8..3f7fb82e 100644 --- a/src/shrpx_http_downstream_connection.cc +++ b/src/shrpx_http_downstream_connection.cc @@ -1402,9 +1402,12 @@ int HttpDownstreamConnection::process_input(const uint8_t *data, auto htperr = llhttp_execute(&response_htp_, reinterpret_cast(data), datalen); - auto nproc = static_cast( - reinterpret_cast(llhttp_get_error_pos(&response_htp_)) - - data); + auto nproc = + htperr == HPE_OK + ? datalen + : static_cast(reinterpret_cast( + llhttp_get_error_pos(&response_htp_)) - + data); if (htperr != HPE_OK && (!downstream_->get_upgraded() || htperr != HPE_PAUSED_UPGRADE)) { diff --git a/src/shrpx_https_upstream.cc b/src/shrpx_https_upstream.cc index 29d7b06e..a640ef5c 100644 --- a/src/shrpx_https_upstream.cc +++ b/src/shrpx_https_upstream.cc @@ -629,8 +629,11 @@ int HttpsUpstream::on_read() { auto htperr = llhttp_execute(&htp_, reinterpret_cast(rb->pos()), rb->rleft()); - auto nread = reinterpret_cast(llhttp_get_error_pos(&htp_)) - - rb->pos(); + auto nread = + htperr == HPE_OK + ? rb->rleft() + : reinterpret_cast(llhttp_get_error_pos(&htp_)) - + rb->pos(); rb->drain(nread); rlimit->startw();