From 95c60b9ff5fcda5c82bc5a3602e372b4a5ae89bc Mon Sep 17 00:00:00 2001 From: Zach41 Date: Sun, 7 Apr 2024 11:50:47 +0000 Subject: [PATCH] Fix wide integer overflow checking --- .../oblib/src/lib/wide_integer/ob_wide_integer_impl.h | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/deps/oblib/src/lib/wide_integer/ob_wide_integer_impl.h b/deps/oblib/src/lib/wide_integer/ob_wide_integer_impl.h index a08bebe55f..0dc432e758 100644 --- a/deps/oblib/src/lib/wide_integer/ob_wide_integer_impl.h +++ b/deps/oblib/src/lib/wide_integer/ob_wide_integer_impl.h @@ -597,21 +597,24 @@ struct ObWideInteger::_impl bool overflow = false; for (unsigned j = 0; j < inner_limit; j++) { for (unsigned i = 0; i < outter_limit; i++) { - carrier += res.items_[i + j] + static_cast(lval.items_[i]) * - static_cast(rval.items_[j]); if (i + j < ITEM_COUNT) { + carrier += res.items_[i + j] + static_cast(lval.items_[i]) * + static_cast(rval.items_[j]); res.items_[i+j] = static_cast(carrier); carrier >>= 64; } else { overflow = true; break; } - } - if (carrier) { + } // end inner while + if (OB_UNLIKELY(overflow)) { + break; + } else if (carrier) { if (j + outter_limit < ITEM_COUNT) { res.items_[j + outter_limit] = static_cast(carrier); } else { overflow = true; + break; } carrier = 0; }