diff options
author | Eike Ziller <eike.ziller@theqtcompany.com> | 2015-11-09 09:55:10 +0100 |
---|---|---|
committer | Eike Ziller <eike.ziller@theqtcompany.com> | 2015-11-10 11:28:02 +0000 |
commit | 10fb3ead23b879fe56dfa9cd1b163b5ab3da3a0c (patch) | |
tree | 037c912be7c91f5548b5df6d8973bd003a25f365 /src/libs/utils/mimetypes | |
parent | b7473459166b9bb895c6dd2e4cc0b6b1c1f72e57 (diff) |
Fix that bogus mime data could lead to endless loop
<mime-type type="text/foo">
<sub-class-of type="text/foo"/>
</mime-type>
Change-Id: Id03cb4a37345ccc083eaaa03c33847b3735a5d4b
Task-number: QTCREATORBUG-13965
Reviewed-by: David Schulz <david.schulz@theqtcompany.com>
Diffstat (limited to 'src/libs/utils/mimetypes')
-rw-r--r-- | src/libs/utils/mimetypes/mimedatabase.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/libs/utils/mimetypes/mimedatabase.cpp b/src/libs/utils/mimetypes/mimedatabase.cpp index be018edcc8e..73bd2576903 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; } |