From 334f5e319c54f6706e40ad9777fed97c5497158e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?kleines=20Filmr=C3=B6llchen?= Date: Mon, 8 Jan 2024 16:24:42 +0100 Subject: [PATCH] LibC: Prevent undefined shift in internal_to_integer New tests will hit a dead bit count of 64, leading to an undefined shift. --- Userland/Libraries/LibC/math.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibC/math.cpp b/Userland/Libraries/LibC/math.cpp index 70d9bae97b5..ee8ea956657 100644 --- a/Userland/Libraries/LibC/math.cpp +++ b/Userland/Libraries/LibC/math.cpp @@ -68,6 +68,9 @@ static FloatType internal_to_integer(FloatType x, RoundingMode rounding_mode) return x; using Extractor = FloatExtractor; + // Most component types are larger than int. + constexpr auto zero = static_cast(0); + constexpr auto one = static_cast(1); Extractor extractor; extractor.d = x; @@ -90,7 +93,8 @@ static FloatType internal_to_integer(FloatType x, RoundingMode rounding_mode) return x; auto dead_bitcount = Extractor::mantissa_bits - unbiased_exponent; - auto dead_mask = (1ull << dead_bitcount) - 1; + // Avoid shifting by the integer type's size since that's UB. + auto dead_mask = dead_bitcount == sizeof(typename Extractor::ComponentType) * 8 ? ~zero : (one << dead_bitcount) - 1; auto dead_bits = extractor.mantissa & dead_mask; extractor.mantissa &= ~dead_mask;