From b86ec2ffcf61718ba632cc27dd1d4c0d437dca23 Mon Sep 17 00:00:00 2001 From: Eladash Date: Fri, 19 Feb 2021 11:14:36 +0200 Subject: [PATCH] Fix potential overflows in utils::aligned_div, utils::rounded_div --- rpcs3/util/asm.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rpcs3/util/asm.hpp b/rpcs3/util/asm.hpp index c4b8f1f4b9..d4e15468e2 100644 --- a/rpcs3/util/asm.hpp +++ b/rpcs3/util/asm.hpp @@ -374,21 +374,21 @@ namespace utils // General purpose aligned division, the result is rounded up not truncated template ::value && std::is_unsigned::value>> - constexpr T aligned_div(T value, ullong align) + constexpr T aligned_div(T value, std::type_identity_t align) { - return static_cast((value + align - 1) / align); + return static_cast(value / align + T{!!(value % align)}); } // General purpose aligned division, the result is rounded to nearest template ::value>> - constexpr T rounded_div(T value, std::conditional_t::value, llong, ullong> align) + constexpr T rounded_div(T value, std::type_identity_t align) { if constexpr (std::is_unsigned::value) { - return static_cast((value + (align / 2)) / align); + return static_cast(value / align + T{(value % align) > (align / 2)}); } - return static_cast((value + (value < 0 ? 0 - align : align) / 2) / align); + return static_cast(value / align + (value > 0 ? T{(value % align) > (align / 2)} : 0 - T{(value % align) < (align / 2)})); } } // namespace utils