Don't use the QRegExp methods that modify the object [QtCore]
authorThiago Macieira <thiago.macieira@intel.com>
Fri, 20 Apr 2012 12:59:30 +0000 (14:59 +0200)
committerQt by Nokia <qt-info@nokia.com>
Fri, 27 Apr 2012 20:52:54 +0000 (22:52 +0200)
QRegExp matching methods modify the object, which we don't want to. In
particular, when we receive a QRegExp from the user or we store in a
context that might require thread-safety, make sure we make a copy
before using it.

QRegularExpression has no such shortcoming.

Task-number: QTBUG-25064
Change-Id: Icf22986cd5f6fd086518c78a7d56e6cadfe9f5f6
Reviewed-by: Giuseppe D'Angelo <dangelog@gmail.com>
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
src/corelib/io/qdiriterator.cpp
src/corelib/kernel/qobject.cpp
src/corelib/mimetypes/qmimeglobpattern.cpp
src/corelib/xml/qxmlutils.cpp

index f2a259b..67ea1c9 100644 (file)
@@ -338,7 +338,8 @@ bool QDirIteratorPrivate::matchesFilters(const QString &fileName, const QFileInf
                                               end = nameRegExps.constEnd();
                 iter != end; ++iter) {
 
-            if (iter->exactMatch(fileName)) {
+            QRegExp copy = *iter;
+            if (copy.exactMatch(fileName)) {
                 matched = true;
                 break;
             }
index 35b46b2..2b2a3c6 100644 (file)
@@ -1654,10 +1654,11 @@ void qt_qFindChildren_helper(const QObject *parent, const QRegExp &re,
     if (!parent || !list)
         return;
     const QObjectList &children = parent->children();
+    QRegExp reCopy = re;
     QObject *obj;
     for (int i = 0; i < children.size(); ++i) {
         obj = children.at(i);
-        if (mo.cast(obj) && re.indexIn(obj->objectName()) != -1)
+        if (mo.cast(obj) && reCopy.indexIn(obj->objectName()) != -1)
             list->append(obj);
 
         if (options & Qt::FindChildrenRecursively)
index de26dba..77d688d 100644 (file)
@@ -135,7 +135,7 @@ bool QMimeGlobPattern::matchFileName(const QString &inputFilename) const
         return (m_pattern == filename);
 
     // Other (quite rare) patterns, like "*.anim[1-9j]": use slow but correct method
-    const QRegExp rx(m_pattern, Qt::CaseSensitive, QRegExp::WildcardUnix);
+    QRegExp rx(m_pattern, Qt::CaseSensitive, QRegExp::WildcardUnix);
     return rx.exactMatch(filename);
 }
 
index 89912b4..44a56de 100644 (file)
@@ -236,7 +236,7 @@ bool QXmlUtils::isEncName(const QString &encName)
      * replace that regexp is probably a 70 lines so I prioritize this to when
      * the dependency is considered alarming, or when the rest of the bugs
      * are fixed. */
-    const QRegExp encNameRegExp(QLatin1String("[A-Za-z][A-Za-z0-9._\\-]*"));
+    QRegExp encNameRegExp(QLatin1String("[A-Za-z][A-Za-z0-9._\\-]*"));
     Q_ASSERT(encNameRegExp.isValid());
 
     return encNameRegExp.exactMatch(encName);