Skip to content

Commit 5a2e763

Browse files
FrankYFTangSquash Bot
authored andcommitted
ICU-23252 Fix int overflow in messagepattern.cpp
See #3762
1 parent 9407fad commit 5a2e763

File tree

5 files changed

+24
-6
lines changed

5 files changed

+24
-6
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: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,13 +1382,14 @@ private static int parseArgNumber(CharSequence s, int start, int limit) {
13821382
} else {
13831383
return ARG_NAME_NOT_NUMBER;
13841384
}
1385-
while (start < limit) {
1385+
while(start<limit) {
13861386
c = s.charAt(start++);
1387-
if ('0' <= c && c <= '9') {
1388-
if (number >= Integer.MAX_VALUE / 10) {
1389-
badNumber = true; // overflow
1387+
if('0'<=c && c <= '9') {
1388+
if(number >= Integer.MAX_VALUE / 10) {
1389+
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: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -948,4 +948,13 @@ public void TestSerialization() {
948948
"ab3.3cd4,4ef***gh50\u00A0%ij",
949949
format2.format(new Object[] {4.4, 3.3, "+++", "***", 50}));
950950
}
951+
@Test
952+
public void TestNumberOverflow() {
953+
try {
954+
MessageFormat format = new MessageFormat("{90000000000}");
955+
errln("MessageFormat overflow should throw IllegalArgumentException");
956+
} catch (IllegalArgumentException e) {
957+
// expeted
958+
}
959+
}
951960
}

0 commit comments

Comments
 (0)