ICU-13632 regex out-of-bounds memory reference fix.
X-SVN-Rev: 41088
This commit is contained in:
parent
8fe72cd82b
commit
0d32dd8f05
@ -1465,8 +1465,10 @@ int32_t RegexCImpl::appendReplacement(RegularExpression *regexp,
|
|||||||
|
|
||||||
int32_t groupNum = 0;
|
int32_t groupNum = 0;
|
||||||
U_ASSERT(c == DOLLARSIGN);
|
U_ASSERT(c == DOLLARSIGN);
|
||||||
UChar32 c32;
|
UChar32 c32 = -1;
|
||||||
U16_GET(replacementText, 0, replIdx, replacementLength, c32);
|
if (replIdx < replacementLength) {
|
||||||
|
U16_GET(replacementText, 0, replIdx, replacementLength, c32);
|
||||||
|
}
|
||||||
if (u_isdigit(c32)) {
|
if (u_isdigit(c32)) {
|
||||||
int32_t numDigits = 0;
|
int32_t numDigits = 0;
|
||||||
int32_t numCaptureGroups = m->fPattern->fGroupMap->size();
|
int32_t numCaptureGroups = m->fPattern->fGroupMap->size();
|
||||||
|
@ -103,6 +103,7 @@ void RegexTest::runIndexedTest( int32_t index, UBool exec, const char* &name, ch
|
|||||||
TESTCASE_AUTO(NamedCaptureLimits);
|
TESTCASE_AUTO(NamedCaptureLimits);
|
||||||
TESTCASE_AUTO(TestBug12884);
|
TESTCASE_AUTO(TestBug12884);
|
||||||
TESTCASE_AUTO(TestBug13631);
|
TESTCASE_AUTO(TestBug13631);
|
||||||
|
TESTCASE_AUTO(TestBug13632);
|
||||||
TESTCASE_AUTO_END;
|
TESTCASE_AUTO_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5831,5 +5832,23 @@ void RegexTest::TestBug13631() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Bug 13632 Out of bounds memory reference if a replacement string ends with a '$',
|
||||||
|
// where a following group specification would be expected.
|
||||||
|
// Failure shows when running the test under Clang's Address Sanitizer.
|
||||||
|
|
||||||
|
void RegexTest::TestBug13632() {
|
||||||
|
UErrorCode status = U_ZERO_ERROR;
|
||||||
|
URegularExpression *re = uregex_openC(" ", 0, nullptr, &status);
|
||||||
|
const char16_t *sourceString = u"Hello, world.";
|
||||||
|
uregex_setText(re, sourceString, u_strlen(sourceString), &status);
|
||||||
|
|
||||||
|
const int32_t destCap = 20;
|
||||||
|
char16_t dest[destCap] = {};
|
||||||
|
const char16_t replacement[] = {u'x', u'$'}; // Not nul terminated string.
|
||||||
|
uregex_replaceAll(re, replacement, 2, dest, destCap, &status);
|
||||||
|
|
||||||
|
assertEquals("", U_REGEX_INVALID_CAPTURE_GROUP_NAME, status);
|
||||||
|
uregex_close(re);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* !UCONFIG_NO_REGULAR_EXPRESSIONS */
|
#endif /* !UCONFIG_NO_REGULAR_EXPRESSIONS */
|
||||||
|
@ -58,7 +58,8 @@ public:
|
|||||||
virtual void TestBug11480();
|
virtual void TestBug11480();
|
||||||
virtual void TestBug12884();
|
virtual void TestBug12884();
|
||||||
virtual void TestBug13631();
|
virtual void TestBug13631();
|
||||||
|
virtual void TestBug13632();
|
||||||
|
|
||||||
// The following functions are internal to the regexp tests.
|
// The following functions are internal to the regexp tests.
|
||||||
virtual void assertUText(const char *expected, UText *actual, const char *file, int line);
|
virtual void assertUText(const char *expected, UText *actual, const char *file, int line);
|
||||||
virtual void assertUTextInvariant(const char *invariant, UText *actual, const char *file, int line);
|
virtual void assertUTextInvariant(const char *invariant, UText *actual, const char *file, int line);
|
||||||
|
Loading…
Reference in New Issue
Block a user