From 8f80c62aa2a3307d0d6248fbb2116851edcdcce4 Mon Sep 17 00:00:00 2001 From: Frank Tang Date: Wed, 24 Jan 2024 16:06:17 -0800 Subject: [PATCH] ICU-22638 Fix cast overflow issue --- icu4c/source/i18n/plurrule.cpp | 4 +++- icu4c/source/test/intltest/plurults.cpp | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/icu4c/source/i18n/plurrule.cpp b/icu4c/source/i18n/plurrule.cpp index 1a9bdf47125..cd460bd0b10 100644 --- a/icu4c/source/i18n/plurrule.cpp +++ b/icu4c/source/i18n/plurrule.cpp @@ -1778,7 +1778,9 @@ void FixedDecimal::init(double n, int32_t v, int64_t f, int32_t e, int32_t c) { if (exponent == 0) { exponent = c; } - if (_isNaN || _isInfinite) { + if (_isNaN || _isInfinite || + source > static_cast(U_INT64_MAX) || + source < static_cast(U_INT64_MIN)) { v = 0; f = 0; intValue = 0; diff --git a/icu4c/source/test/intltest/plurults.cpp b/icu4c/source/test/intltest/plurults.cpp index fb95ef43dc7..bdeac269e8c 100644 --- a/icu4c/source/test/intltest/plurults.cpp +++ b/icu4c/source/test/intltest/plurults.cpp @@ -243,8 +243,8 @@ void PluralRulesTest::testAPI(/*char *par*/) dataerrln("ERROR: Could not create PluralRules for testing fractions - exiting"); return; } - double fData[] = {-101, -100, -1, -0.0, 0, 0.1, 1, 1.999, 2.0, 100, 100.001 }; - bool isKeywordA[] = {true, false, false, false, false, true, false, true, false, false, true }; + double fData[] = {-101, -100, -1, -0.0, 0, 0.1, 1, 1.999, 2.0, 100, 100.001, 1.39e188 }; + bool isKeywordA[] = {true, false, false, false, false, true, false, true, false, false, true, true }; for (int32_t i=0; iselect(fData[i])== KEYWORD_A) != isKeywordA[i]) { errln("File %s, Line %d, ERROR: plural rules for decimal fractions test failed!\n"