From 5aef8f280fd7b7d8d214b0ccc8a71db7ab2a77e7 Mon Sep 17 00:00:00 2001 From: Daniel Bertalan Date: Mon, 26 Jun 2023 10:23:19 +0200 Subject: [PATCH] LibJS: Fix integer overflow in Number::exponentiate The exponent might be larger than the range of values representable by an i32, so we have to use the `fmod` function instead of the modulo operator. This fixes 3 test262 tests on AArch64. No changes on x86-64. --- Userland/Libraries/LibJS/Runtime/Value.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/Value.cpp b/Userland/Libraries/LibJS/Runtime/Value.cpp index 15f7d6a14e..cc87d871f6 100644 --- a/Userland/Libraries/LibJS/Runtime/Value.cpp +++ b/Userland/Libraries/LibJS/Runtime/Value.cpp @@ -1936,7 +1936,7 @@ static Value exp_double(Value base, Value exponent) // 5. If base is -∞𝔽, then if (base.is_negative_infinity()) { - auto is_odd_integral_number = exponent.is_integral_number() && (static_cast(exponent.as_double()) % 2 != 0); + auto is_odd_integral_number = exponent.is_integral_number() && (fmod(exponent.as_double(), 2.0) != 0); // a. If exponent > +0𝔽, then if (exponent.as_double() > 0) { @@ -1958,7 +1958,7 @@ static Value exp_double(Value base, Value exponent) // 7. If base is -0𝔽, then if (base.is_negative_zero()) { - auto is_odd_integral_number = exponent.is_integral_number() && (static_cast(exponent.as_double()) % 2 != 0); + auto is_odd_integral_number = exponent.is_integral_number() && (fmod(exponent.as_double(), 2.0) != 0); // a. If exponent > +0𝔽, then if (exponent.as_double() > 0) {