| Index: source/i18n/rematch.cpp
|
| ===================================================================
|
| --- source/i18n/rematch.cpp (revision 98343)
|
| +++ source/i18n/rematch.cpp (working copy)
|
| @@ -5598,6 +5598,7 @@
|
| const UChar *foldChars = NULL;
|
| int32_t foldOffset, foldLength;
|
| UChar32 c;
|
| + UBool c_is_valid = FALSE;
|
|
|
| #ifdef REGEX_SMART_BACKTRACKING
|
| int32_t originalInputIdx = fp->fInputIdx;
|
| @@ -5607,23 +5608,29 @@
|
| foldOffset = foldLength = 0;
|
|
|
| while (patternChars < patternEnd && success) {
|
| - if(foldOffset < foldLength) {
|
| - U16_NEXT_UNSAFE(foldChars, foldOffset, c);
|
| - } else {
|
| - U16_NEXT(inputBuf, fp->fInputIdx, fActiveLimit, c);
|
| - foldLength = ucase_toFullFolding(csp, c, &foldChars, U_FOLD_CASE_DEFAULT);
|
| - if(foldLength >= 0) {
|
| - if(foldLength <= UCASE_MAX_STRING_LENGTH) { // !!!: Does not correctly handle chars that fold to 0-length strings
|
| - foldOffset = 0;
|
| - U16_NEXT_UNSAFE(foldChars, foldOffset, c);
|
| - } else {
|
| - c = foldLength;
|
| - foldLength = foldOffset; // to avoid reading chars from the folding buffer
|
| + if (fp->fInputIdx < fActiveLimit) { // don't read past end of string
|
| + if(foldOffset < foldLength) {
|
| + U16_NEXT_UNSAFE(foldChars, foldOffset, c);
|
| + c_is_valid = TRUE;
|
| + } else {
|
| + // test pre-condition of U16_NEXT: i < length
|
| + U_ASSERT(fp->fInputIdx < fActiveLimit);
|
| + U16_NEXT(inputBuf, fp->fInputIdx, fActiveLimit, c);
|
| + c_is_valid = TRUE;
|
| + foldLength = ucase_toFullFolding(csp, c, &foldChars, U_FOLD_CASE_DEFAULT);
|
| + if(foldLength >= 0) {
|
| + if(foldLength <= UCASE_MAX_STRING_LENGTH) { // !!!: Does not correctly handle chars that fold to 0-length strings
|
| + foldOffset = 0;
|
| + U16_NEXT_UNSAFE(foldChars, foldOffset, c);
|
| + } else {
|
| + c = foldLength;
|
| + foldLength = foldOffset; // to avoid reading chars from the folding buffer
|
| + }
|
| }
|
| }
|
| }
|
|
|
| - if (fp->fInputIdx <= fActiveLimit) {
|
| + if (fp->fInputIdx <= fActiveLimit && c_is_valid) {
|
| if (U_IS_BMP(c)) {
|
| success = (*patternChars == c);
|
| patternChars += 1;
|
| @@ -6070,4 +6077,3 @@
|
| U_NAMESPACE_END
|
|
|
| #endif // !UCONFIG_NO_REGULAR_EXPRESSIONS
|
| -
|
|
|