瀏覽代碼

AK: Make sure no overflow occurs in number_string_with_one_decimal

A possible integer overflow might have occured inside the function in
case (number % unit) * 10 did not fit into a u64. So it is verified that
this does not happen at the beginning of the function.
Arda Cinar 2 年之前
父節點
當前提交
ccb6b4f943
共有 1 個文件被更改,包括 8 次插入2 次删除
  1. 8 2
      AK/NumberFormat.cpp

+ 8 - 2
AK/NumberFormat.cpp

@@ -4,8 +4,10 @@
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
+#include <AK/Assertions.h>
 #include <AK/DeprecatedString.h>
 #include <AK/NumberFormat.h>
+#include <AK/NumericLimits.h>
 #include <AK/StringView.h>
 
 namespace AK {
@@ -13,8 +15,12 @@ namespace AK {
 // FIXME: Remove this hackery once printf() supports floats.
 static DeprecatedString number_string_with_one_decimal(u64 number, u64 unit, StringView suffix)
 {
-    int decimal = (number % unit) * 10 / unit;
-    return DeprecatedString::formatted("{}.{} {}", number / unit, decimal, suffix);
+    constexpr auto max_unit_size = NumericLimits<u64>::max() / 10;
+    VERIFY(unit < max_unit_size);
+
+    auto integer_part = number / unit;
+    auto decimal_part = (number % unit) * 10 / unit;
+    return DeprecatedString::formatted("{}.{} {}", integer_part, decimal_part, suffix);
 }
 
 DeprecatedString human_readable_quantity(u64 quantity, StringView unit)