This is an automated email from the ASF dual-hosted git repository. bcall pushed a commit to branch 8.0.x in repository https://gitbox.apache.org/repos/asf/trafficserver.git
commit a8d6a1722e0227f5dab0775b81a0e6323c50d592 Author: Leif Hedstrom <zw...@apache.org> AuthorDate: Wed Jan 9 09:46:41 2019 -0700 This improves on #3008, making the code clearer (cherry picked from commit 571d11ecf49c410470e2efbc1eca469618629084) --- proxy/http/HttpSM.cc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/proxy/http/HttpSM.cc b/proxy/http/HttpSM.cc index 8d434d8..b6d03b5 100644 --- a/proxy/http/HttpSM.cc +++ b/proxy/http/HttpSM.cc @@ -4170,8 +4170,6 @@ HttpSM::parse_range_and_compare(MIMEField *field, int64_t content_length) const char *s, *e, *tmp; RangeRecord *ranges = nullptr; int64_t start, end; - int64_t cutoff = INT64_MAX / 10; - int64_t cutlim = INT64_MAX % 10; ink_assert(field != nullptr && t_state.range_setup == HttpTransact::RANGE_NONE && t_state.ranges == nullptr); @@ -4230,11 +4228,13 @@ HttpSM::parse_range_and_compare(MIMEField *field, int64_t content_length) for (start = 0; s < e && *s >= '0' && *s <= '9'; ++s) { // check the int64 overflow in case of high gcc with O3 option // thinking the start is always positive - if (start >= cutoff && (start > cutoff || *s - '0' > cutlim)) { + int64_t new_start = start * 10 + (*s - '0'); + + if (new_start < start) { // Overflow t_state.range_setup = HttpTransact::RANGE_NONE; goto Lfaild; } - start = start * 10 + (*s - '0'); + start = new_start; } // skip last white spaces for (; s < e && ParseRules::is_ws(*s); ++s) { @@ -4268,11 +4268,13 @@ HttpSM::parse_range_and_compare(MIMEField *field, int64_t content_length) for (end = 0; s < e && *s >= '0' && *s <= '9'; ++s) { // check the int64 overflow in case of high gcc with O3 option // thinking the start is always positive - if (end >= cutoff && (end > cutoff || *s - '0' > cutlim)) { + int64_t new_end = end * 10 + (*s - '0'); + + if (new_end < end) { // Overflow t_state.range_setup = HttpTransact::RANGE_NONE; goto Lfaild; } - end = end * 10 + (*s - '0'); + end = new_end; } // skip last white spaces for (; s < e && ParseRules::is_ws(*s); ++s) {