From 7a81bce13be27a84c76db876139530048f805815 Mon Sep 17 00:00:00 2001 From: Sergey Kroshnin Date: Fri, 11 Oct 2019 16:51:29 +0300 Subject: [PATCH] Update from_multiplier () overflow checks (#2337) --- nano/lib/numbers.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/nano/lib/numbers.cpp b/nano/lib/numbers.cpp index af5d5ee7..6ed88586 100644 --- a/nano/lib/numbers.cpp +++ b/nano/lib/numbers.cpp @@ -915,8 +915,19 @@ std::string nano::to_string (double const value_a, int const precision_a) uint64_t nano::difficulty::from_multiplier (double const multiplier_a, uint64_t const base_difficulty_a) { assert (multiplier_a > 0.); - uint64_t reverse_difficulty (static_cast ((-base_difficulty_a) / multiplier_a)); - return (reverse_difficulty != 0 || base_difficulty_a == 0 || multiplier_a < 1. ? -reverse_difficulty : std::numeric_limits::max ()); + nano::uint128_t reverse_difficulty ((-base_difficulty_a) / multiplier_a); + if (reverse_difficulty > std::numeric_limits::max ()) + { + return 0; + } + else if (reverse_difficulty != 0 || base_difficulty_a == 0 || multiplier_a < 1.) + { + return -(static_cast (reverse_difficulty)); + } + else + { + return std::numeric_limits::max (); + } } double nano::difficulty::to_multiplier (uint64_t const difficulty_a, uint64_t const base_difficulty_a)