summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libs/utils/mimetypes/mimedatabase.cpp10
-rw-r--r--src/plugins/coreplugin/editormanager/editormanager.cpp12
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()));
+ }
}
}
}