From 377198641c627cf5c3f57e4c9415e574373f927b Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 30 Aug 2024 11:36:04 +0200 Subject: [PATCH] Update mime database from Qt qtbase/54656da9ace06caf4a0eeb1832989c0ab211a4a0 QMimeDatabase: handle buggy type definitions with circular inheritance Change-Id: I6cee043587ee6a60eb53d072824fcd664a5f8ce0 Reviewed-by: Jarek Kobus --- src/libs/utils/mimetypes2/mimedatabase.cpp | 17 +++++++++++++++-- src/libs/utils/mimetypes2/mimetype.cpp | 7 +++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/libs/utils/mimetypes2/mimedatabase.cpp b/src/libs/utils/mimetypes2/mimedatabase.cpp index 596318427bf..2f4d36d39d5 100644 --- a/src/libs/utils/mimetypes2/mimedatabase.cpp +++ b/src/libs/utils/mimetypes2/mimedatabase.cpp @@ -39,6 +39,15 @@ static QString plainTextMimeType() namespace Utils { +// simplified from qduplicatetracker_p.h +template +class DuplicateTracker { +public: + bool hasSeen(const T &v) { return Utils::insert(seen, v); } +private: + QSet seen; +}; + Q_GLOBAL_STATIC(MimeDatabasePrivate, staticMimeDatabase) MimeDatabasePrivate *MimeDatabasePrivate::instance() @@ -584,6 +593,7 @@ QList MimeDatabasePrivate::allMimeTypes() bool MimeDatabasePrivate::inherits(const QString &mime, const QString &parent) { const QString resolvedParent = resolveAlias(parent); + DuplicateTracker seen; std::stack toCheck; toCheck.push(mime); while (!toCheck.empty()) { @@ -592,8 +602,11 @@ bool MimeDatabasePrivate::inherits(const QString &mime, const QString &parent) const QString mimeName = toCheck.top(); toCheck.pop(); const auto parentList = parents(mimeName); - for (const QString &par : parentList) - toCheck.push(resolveAlias(par)); + for (const QString &par : parentList) { + const QString resolvedPar = resolveAlias(par); + if (!seen.hasSeen(resolvedPar)) + toCheck.push(resolvedPar); + } } return false; } diff --git a/src/libs/utils/mimetypes2/mimetype.cpp b/src/libs/utils/mimetypes2/mimetype.cpp index 22cfd18e733..06f5bc678f9 100644 --- a/src/libs/utils/mimetypes2/mimetype.cpp +++ b/src/libs/utils/mimetypes2/mimetype.cpp @@ -338,14 +338,17 @@ QStringList MimeType::parentMimeTypes() const static void collectParentMimeTypes(const QString &mime, QStringList &allParents) { const QStringList parents = MimeDatabasePrivate::instance()->mimeParents(mime); + QStringList newParents; for (const QString &parent : parents) { // I would use QSet, but since order matters I better not - if (!allParents.contains(parent)) + if (!allParents.contains(parent)) { allParents.append(parent); + newParents.append(parent); + } } // We want a breadth-first search, so that the least-specific parent (octet-stream) is last // This means iterating twice, unfortunately. - for (const QString &parent : parents) + for (const QString &parent : newParents) collectParentMimeTypes(parent, allParents); }