From 7238dc91e856c46e13f02b5f25f03675f415a5d9 Mon Sep 17 00:00:00 2001 From: Vincent van Ravesteijn Date: Sat, 14 Mar 2009 10:39:27 +0000 Subject: [PATCH] branch: change the use of QString::indexOf(RegExp) into RegExp::indexIn(QString) to avoid crashes and infinite loops with Qt4.5. See: http://www.lyx.org/trac/changeset/28746 git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_1_6_X@28767 a592a061-630c-0410-9148-cb99ea01b6c8 --- ANNOUNCE | 2 ++ src/frontends/qt4/GuiLog.cpp | 12 ++++++------ src/frontends/qt4/LaTeXHighlighter.cpp | 22 +++++++++++----------- status.16x | 2 ++ 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/ANNOUNCE b/ANNOUNCE index 8ddc9e515e..e5675bf0c4 100644 --- a/ANNOUNCE +++ b/ANNOUNCE @@ -267,6 +267,8 @@ What's new in version 1.6.2? - Fix a crash when an unfinished macro is edited and deleted in math mode (bug 5744). +- Fix the use of regular expressions to avoid crashes with Qt4.5. + - Ignore the master_buffer setting in Document>Settings if the current document is no real child. This fixes a crash when using the outliner in such files (bug 5653). diff --git a/src/frontends/qt4/GuiLog.cpp b/src/frontends/qt4/GuiLog.cpp index d59d30a48d..a1a46d02c8 100644 --- a/src/frontends/qt4/GuiLog.cpp +++ b/src/frontends/qt4/GuiLog.cpp @@ -68,27 +68,27 @@ void LogHighlighter::highlightBlock(QString const & text) { // Info QRegExp exprInfo("^(Document Class:|LaTeX Font Info:|File:|Package:|Language:|Underfull|Overfull|\\(|\\\\).*$"); - int index = text.indexOf(exprInfo); + int index = exprInfo.indexIn(text); while (index >= 0) { int length = exprInfo.matchedLength(); setFormat(index, length, infoFormat); - index = text.indexOf(exprInfo, index + length); + index = exprInfo.indexIn(text, index + length); } // LaTeX Warning: QRegExp exprWarning("^LaTeX Warning.*$"); - index = text.indexOf(exprWarning); + index = exprWarning.indexIn(text); while (index >= 0) { int length = exprWarning.matchedLength(); setFormat(index, length, warningFormat); - index = text.indexOf(exprWarning, index + length); + index = exprWarning.indexIn(text, index + length); } // ! error QRegExp exprError("^!.*$"); - index = text.indexOf(exprError); + index = exprError.indexIn(text); while (index >= 0) { int length = exprError.matchedLength(); setFormat(index, length, errorFormat); - index = text.indexOf(exprError, index + length); + index = exprError.indexIn(text, index + length); } } diff --git a/src/frontends/qt4/LaTeXHighlighter.cpp b/src/frontends/qt4/LaTeXHighlighter.cpp index 00f8064af9..9a9e5459a4 100644 --- a/src/frontends/qt4/LaTeXHighlighter.cpp +++ b/src/frontends/qt4/LaTeXHighlighter.cpp @@ -35,11 +35,11 @@ void LaTeXHighlighter::highlightBlock(QString const & text) { // $ $ static const QRegExp exprMath("\\$[^\\$]*\\$"); - int index = text.indexOf(exprMath); + int index = exprMath.indexIn(text); while (index >= 0) { int length = exprMath.matchedLength(); setFormat(index, length, mathFormat); - index = text.indexOf(exprMath, index + length); + index = exprMath.indexIn(text, index + length); } // [ ] static const QRegExp exprStartDispMath("(\\\\\\[|" @@ -67,9 +67,9 @@ void LaTeXHighlighter::highlightBlock(QString const & text) // start search from 0 (for end disp math) // otherwise, start search from 'begin disp math' if (previousBlockState() != 1) - startIndex = text.indexOf(exprStartDispMath); + startIndex = exprStartDispMath.indexIn(text); while (startIndex >= 0) { - int endIndex = text.indexOf(exprEndDispMath, startIndex); + int endIndex = exprEndDispMath.indexIn(text, startIndex); int length; if (endIndex == -1) { setCurrentBlockState(1); @@ -78,15 +78,15 @@ void LaTeXHighlighter::highlightBlock(QString const & text) length = endIndex - startIndex + exprEndDispMath.matchedLength(); } setFormat(startIndex, length, mathFormat); - startIndex = text.indexOf(exprStartDispMath, startIndex + length); + startIndex = exprStartDispMath.indexIn(text, startIndex + length); } // \whatever static const QRegExp exprKeyword("\\\\[A-Za-z]+"); - index = text.indexOf(exprKeyword); + index = exprKeyword.indexIn(text); while (index >= 0) { int length = exprKeyword.matchedLength(); setFormat(index, length, keywordFormat); - index = text.indexOf(exprKeyword, index + length); + index = exprKeyword.indexIn(text, index + length); } // %comment // Treat a line as a comment starting at a percent sign @@ -95,23 +95,23 @@ void LaTeXHighlighter::highlightBlock(QString const & text) // ** an even number of backslashes // ** any character other than a backslash QRegExp exprComment("(?:^|[^\\\\])(?:\\\\\\\\)*(%).*$"); - text.indexOf(exprComment); + exprComment.indexIn(text); index = exprComment.pos(1); while (index >= 0) { int const length = exprComment.matchedLength() - (index - exprComment.pos(0)); setFormat(index, length, commentFormat); - text.indexOf(exprComment, index + length); + exprComment.indexIn(text, index + length); index = exprComment.pos(1); } // QString lyxwarn = qt_("LyX Warning: "); QRegExp exprWarning("<" + lyxwarn + "[^<]*>"); - index = text.indexOf(exprWarning); + index = exprWarning.indexIn(text); while (index >= 0) { int length = exprWarning.matchedLength(); setFormat(index, length, warningFormat); - index = text.indexOf(exprWarning, index + length); + index = exprWarning.indexIn(text, index + length); } } diff --git a/status.16x b/status.16x index 998cdca17d..c3d385c7a8 100644 --- a/status.16x +++ b/status.16x @@ -210,6 +210,8 @@ What's new - Fix a crash when an unfinished macro is edited and deleted in math mode (bug 5744). + +- Fix the use of regular expressions to avoid crashes with Qt4.5. - Ignore the master_buffer setting in Document>Settings if the current document is no real child. This fixes a crash when using the outliner