diff options
| -rw-r--r-- | src/libs/utils/mimetypes/mimedatabase.cpp | 10 | ||||
| -rw-r--r-- | src/plugins/coreplugin/editormanager/editormanager.cpp | 12 |
2 files changed, 18 insertions, 4 deletions
diff --git a/src/libs/utils/mimetypes/mimedatabase.cpp b/src/libs/utils/mimetypes/mimedatabase.cpp index be018edcc8..73bd257690 100644 --- a/src/libs/utils/mimetypes/mimedatabase.cpp +++ b/src/libs/utils/mimetypes/mimedatabase.cpp @@ -230,13 +230,19 @@ bool MimeDatabasePrivate::inherits(const QString &mime, const QString &parent) const QString resolvedParent = provider()->resolveAlias(parent); //Q_ASSERT(provider()->resolveAlias(mime) == mime); QStack<QString> toCheck; + QSet<QString> seen; // avoid endless loop on bogus mime data toCheck.push(mime); + seen.insert(mime); while (!toCheck.isEmpty()) { const QString current = toCheck.pop(); if (current == resolvedParent) return true; - foreach (const QString &par, provider()->parents(current)) - toCheck.push(par); + foreach (const QString &par, provider()->parents(current)) { + int seenSize = seen.size(); + seen.insert(par); + if (seen.size() != seenSize) // haven't seen before, so add + toCheck.push(par); + } } return false; } diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index a251523a31..d391477711 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -2516,7 +2516,9 @@ static void mimeTypeFactoryLookup(const Utils::MimeType &mimeType, // * application/octet-stream // * text/plain QList<Utils::MimeType> queue; + QSet<QString> seen; queue.append(mimeType); + seen.insert(mimeType.name()); while (!queue.isEmpty()) { Utils::MimeType mt = queue.takeFirst(); // check for matching factories @@ -2536,8 +2538,14 @@ static void mimeTypeFactoryLookup(const Utils::MimeType &mimeType, QStringList parentNames = mt.parentMimeTypes(); foreach (const QString &parentName, parentNames) { const Utils::MimeType parent = mdb.mimeTypeForName(parentName); - if (parent.isValid()) - queue.append(parent); + if (parent.isValid()) { + int seenSize = seen.size(); + seen.insert(parent.name()); + if (seen.size() != seenSize) // not seen before, so add + queue.append(parent); + else + qWarning("MimeTypes: Parent hierarchy loop detected for '%s'!", qPrintable(parent.name())); + } } } } |
