From e9ad8d5e4f5a57faac5a627810034d3173d041f2 Mon Sep 17 00:00:00 2001 From: Andi Gallo Date: Fri, 4 Aug 2023 10:33:30 +0000 Subject: [PATCH] LibWeb: Use i64 for intermediate value in CSSPixels multiplication Reduce the chance of overflow due to fixed point denominator being squared when multiplying the raw values, before adjusting the final value back. --- Tests/LibWeb/TestCSSPixels.cpp | 8 ++++++++ Userland/Libraries/LibWeb/PixelUnits.cpp | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Tests/LibWeb/TestCSSPixels.cpp b/Tests/LibWeb/TestCSSPixels.cpp index 7c78cbab9d..99c839a7ba 100644 --- a/Tests/LibWeb/TestCSSPixels.cpp +++ b/Tests/LibWeb/TestCSSPixels.cpp @@ -87,4 +87,12 @@ TEST_CASE(saturated_subtraction) EXPECT_EQ(value - -1, CSSPixels(INFINITY)); } +TEST_CASE(multiplication_uses_i64_for_raw_values) +{ + CSSPixels a(1200); + CSSPixels b(647); + CSSPixels c = a * b; + EXPECT_EQ(c, CSSPixels(776400)); +} + } diff --git a/Userland/Libraries/LibWeb/PixelUnits.cpp b/Userland/Libraries/LibWeb/PixelUnits.cpp index 6fc367a8f3..e8077bb630 100644 --- a/Userland/Libraries/LibWeb/PixelUnits.cpp +++ b/Userland/Libraries/LibWeb/PixelUnits.cpp @@ -119,7 +119,7 @@ CSSPixels CSSPixels::operator-(CSSPixels const& other) const CSSPixels CSSPixels::operator*(CSSPixels const& other) const { CSSPixels result; - result.set_raw_value((raw_value() * other.raw_value()) >> fractional_bits); + result.set_raw_value((static_cast(raw_value()) * other.raw_value()) >> fractional_bits); return result; }