Skip to content

Commit 59577f6

Browse files
committed
ICU-23252 Fix int overflow in messagepattern.cpp
See #3762
1 parent 81f06ac commit 59577f6

File tree

5 files changed

+21
-2
lines changed

5 files changed

+21
-2
lines changed

icu4c/source/common/messagepattern.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -914,8 +914,9 @@ MessagePattern::parseArgNumber(const UnicodeString &s, int32_t start, int32_t li
914914
if(0x30<=c && c<=0x39) {
915915
if(number>=INT32_MAX/10) {
916916
badNumber=true; // overflow
917+
} else {
918+
number=number*10+(c-0x30);
917919
}
918-
number=number*10+(c-0x30);
919920
} else {
920921
return UMSGPAT_ARG_NAME_NOT_NUMBER;
921922
}

icu4c/source/test/intltest/tmsgfmt.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ TestMessageFormat::runIndexedTest(int32_t index, UBool exec,
7575
TESTCASE_AUTO(TestMessageFormatNumberSkeleton);
7676
TESTCASE_AUTO(TestMessageFormatDateSkeleton);
7777
TESTCASE_AUTO(TestMessageFormatTimeSkeleton);
78+
TESTCASE_AUTO(TestNumberOverflow);
7879
TESTCASE_AUTO_END;
7980
}
8081

@@ -2075,4 +2076,9 @@ void TestMessageFormat::TestMessageFormatTimeSkeleton() {
20752076
doTheRealDateTimeSkeletonTesting(date, u"{0,time,'::'yMMMMd}", "en", u"::2021November23", status);
20762077
}
20772078

2079+
void TestMessageFormat::TestNumberOverflow() {
2080+
IcuTestErrorCode status(*this, "TestNumberOverflow");
2081+
MessageFormat msgf(u"{90000000000}", status);
2082+
status.expectErrorAndReset(U_PATTERN_SYNTAX_ERROR);
2083+
}
20782084
#endif /* #if !UCONFIG_NO_FORMATTING */

icu4c/source/test/intltest/tmsgfmt.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ class TestMessageFormat: public IntlTest {
124124
void TestMessageFormatNumberSkeleton();
125125
void TestMessageFormatDateSkeleton();
126126
void TestMessageFormatTimeSkeleton();
127+
void TestNumberOverflow();
127128

128129
private:
129130
UnicodeString GetPatternAndSkipSyntax(const MessagePattern& pattern);

icu4j/main/core/src/main/java/com/ibm/icu/text/MessagePattern.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1387,8 +1387,9 @@ private static int parseArgNumber(CharSequence s, int start, int limit) {
13871387
if ('0' <= c && c <= '9') {
13881388
if (number >= Integer.MAX_VALUE / 10) {
13891389
badNumber = true; // overflow
1390+
} else {
1391+
number = number * 10 + (c - '0');
13901392
}
1391-
number = number * 10 + (c - '0');
13921393
} else {
13931394
return ARG_NAME_NOT_NUMBER;
13941395
}

icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/MessageRegressionTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -948,4 +948,14 @@ public void TestSerialization() {
948948
"ab3.3cd4,4ef***gh50\u00A0%ij",
949949
format2.format(new Object[] {4.4, 3.3, "+++", "***", 50}));
950950
}
951+
952+
@Test
953+
public void TestNumberOverflow() {
954+
try {
955+
MessageFormat format = new MessageFormat("{90000000000}");
956+
errln("MessageFormat overflow should throw IllegalArgumentException");
957+
} catch (IllegalArgumentException e) {
958+
// expeted
959+
}
960+
}
951961
}

0 commit comments

Comments
 (0)