Fix occasional Konqueror crashes on kjs/regexp

This relates to old KDE3 commit
https://quickgit.kde.org/?p=kdelibs.git&a=commit&h=fee91015

Signed-off-by: Slávek Banko <slavek.banko@axis.cz>
(cherry picked from commit e9d546a6a3)
pull/16/head
Slávek Banko 9 years ago
parent fef74a0f99
commit 7e27cf22d4

@ -325,13 +325,15 @@ UString RegExp::match(const UString &s, int i, int *pos, int **ovector)
++startPos; ++startPos;
nextPos = startPos; nextPos = startPos;
while (originalPos[nextPos] < (i + 1)) if (i < s.size()) {
++nextPos; while (originalPos[nextPos] < (i + 1))
++nextPos;
}
} else } else
#endif #endif
{ {
startPos = i; startPos = i;
nextPos = i + 1; nextPos = i + (i < s.size() ? 1 : 0);
} }
int baseFlags = int baseFlags =
@ -339,12 +341,13 @@ UString RegExp::match(const UString &s, int i, int *pos, int **ovector)
utf8Support == Supported ? PCRE_NO_UTF8_CHECK : utf8Support == Supported ? PCRE_NO_UTF8_CHECK :
#endif #endif
0; 0;
if (pcre_exec(pcregex, NULL, buffer, bufferSize, startPos, int numMatches = pcre_exec(pcregex, NULL, buffer, bufferSize, startPos,
m_notEmpty ? (PCRE_NOTEMPTY | PCRE_ANCHORED | baseFlags) : baseFlags, // see man pcretest m_notEmpty ? (PCRE_NOTEMPTY | PCRE_ANCHORED | baseFlags) : baseFlags, // see man pcretest
ovector ? *ovector : 0L, ovecsize) == PCRE_ERROR_NOMATCH) ovector ? *ovector : 0L, ovecsize);
if (numMatches < 0)
{ {
// Failed to match. // Failed to match.
if ((flgs & Global) && m_notEmpty && ovector) if (numMatches == PCRE_ERROR_NOMATCH && (flgs & Global) && m_notEmpty && ovector && startPos < nextPos)
{ {
// We set m_notEmpty ourselves, to look for a non-empty match // We set m_notEmpty ourselves, to look for a non-empty match
// (see man pcretest or pcretest.c for details). // (see man pcretest or pcretest.c for details).
@ -353,8 +356,9 @@ UString RegExp::match(const UString &s, int i, int *pos, int **ovector)
fprintf(stderr, "No match after m_notEmpty. +1 and keep going.\n"); fprintf(stderr, "No match after m_notEmpty. +1 and keep going.\n");
#endif #endif
m_notEmpty = 0; m_notEmpty = 0;
if (pcre_exec(pcregex, NULL, buffer, bufferSize, nextPos, baseFlags, numMatches = pcre_exec(pcregex, NULL, buffer, bufferSize, nextPos, baseFlags,
ovector ? *ovector : 0L, ovecsize) == PCRE_ERROR_NOMATCH) ovector ? *ovector : 0L, ovecsize);
if (numMatches < 0)
return UString::null; return UString::null;
} }
else // done else // done
@ -364,7 +368,7 @@ UString RegExp::match(const UString &s, int i, int *pos, int **ovector)
// Got a match, proceed with it. // Got a match, proceed with it.
// But fix up the ovector if need be.. // But fix up the ovector if need be..
if (ovector && originalPos) { if (ovector && originalPos) {
for (unsigned c = 0; c < 2 * (nrSubPatterns + 1); ++c) { for (unsigned c = 0; c < 2 * TQMIN((unsigned)numMatches, nrSubPatterns+1); ++c) {
if ((*ovector)[c] != -1) if ((*ovector)[c] != -1)
(*ovector)[c] = originalPos[(*ovector)[c]]; (*ovector)[c] = originalPos[(*ovector)[c]];
} }

Loading…
Cancel
Save