diff --git a/0001-HPack-fix-a-Yoda-Condition.patch b/0001-HPack-fix-a-Yoda-Condition.patch deleted file mode 100644 index 7dfefa9..0000000 --- a/0001-HPack-fix-a-Yoda-Condition.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 658607a34ead214fbacbc2cca44915655c318ea9 Mon Sep 17 00:00:00 2001 -From: Marc Mutz -Date: Tue, 12 Dec 2023 20:51:56 +0100 -Subject: [PATCH] HPack: fix a Yoda Condition - -Putting the variable on the LHS of a relational operation makes the -expression easier to read. In this case, we find that the whole -expression is nonsensical as an overflow protection, because if -name.size() + value.size() overflows, the result will exactly _not_ -be > max() - 32, because UB will have happened. - -To be fixed in a follow-up commit. - -As a drive-by, add parentheses around the RHS. - -Pick-to: 6.7 6.6 6.5 6.2 5.15 -Change-Id: I35ce598884c37c51b74756b3bd2734b9aad63c09 -Reviewed-by: Allan Sandfeld Jensen ---- - src/network/access/http2/hpacktable.cpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/network/access/http2/hpacktable.cpp b/src/network/access/http2/hpacktable.cpp -index 74a09a207ffb..c8c5d098c80a 100644 ---- a/src/network/access/http2/hpacktable.cpp -+++ b/src/network/access/http2/hpacktable.cpp -@@ -27,7 +27,7 @@ HeaderSize entry_size(QByteArrayView name, QByteArrayView value) - // 32 octets of overhead." - - const unsigned sum = unsigned(name.size() + value.size()); -- if (std::numeric_limits::max() - 32 < sum) -+ if (sum > (std::numeric_limits::max() - 32)) - return HeaderSize(); - return HeaderSize(true, quint32(sum + 32)); - } --- -2.16.3 - diff --git a/0001-Http2-fix-potential-overflow-in-assemble_hpack_block.patch b/0001-Http2-fix-potential-overflow-in-assemble_hpack_block.patch deleted file mode 100644 index b61b600..0000000 --- a/0001-Http2-fix-potential-overflow-in-assemble_hpack_block.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 8907dedc858cc344d770a2e826d6acc516429540 Mon Sep 17 00:00:00 2001 -From: Marc Mutz -Date: Tue, 19 Dec 2023 14:22:37 +0100 -Subject: [PATCH] Http2: fix potential overflow in assemble_hpack_block() -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The function is given a vector of Http2::Frame's and flattens it into -a vector. While each Frame can contain a maximum of 16GiB of -data (24-bit size field), one "only" needs 257 of them to overflow the -quint32 variable's range. - -So make sure any overflow does not go undetected. - -Keep the limited uint32_t range for now, as we don't know whether all -consumers of the result can deal with more than 4GiB of data. - -Since all these frames must be in memory, this cannot overflow in -practice on 32-bit machines. - -Pick-to: 6.7 6.6 6.5 6.2 5.15 -Change-Id: Iafaa7d1c870cba9100e75065db11d95934f86213 -Reviewed-by: MÃ¥rten Nordheim -(cherry picked from commit 1e6bb61af3ae29755f93b92f157df026f934ae61) - -* asturmlechner 2024-01-02: Use correct include for 5.15 ---- - src/network/access/qhttp2protocolhandler.cpp | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - -diff --git a/src/network/access/qhttp2protocolhandler.cpp b/src/network/access/qhttp2protocolhandler.cpp -index 39dd460881a..ead88d781ae 100644 ---- a/src/network/access/qhttp2protocolhandler.cpp -+++ b/src/network/access/qhttp2protocolhandler.cpp -@@ -10,10 +10,12 @@ - #include - - #include -+ - #include - #include - #include - #include -+#include - #include - - #include -@@ -90,8 +92,10 @@ std::vector assemble_hpack_block(const std::vector &frames) - std::vector hpackBlock; - - quint32 total = 0; -- for (const auto &frame : frames) -- total += frame.hpackBlockSize(); -+ for (const auto &frame : frames) { -+ if (add_overflow(total, frame.hpackBlockSize(), &total)) -+ return hpackBlock; -+ } - - if (!total) - return hpackBlock; --- -GitLab - diff --git a/0001-QMimeDatabase-collect-glob-patterns-from.patch b/0001-QMimeDatabase-collect-glob-patterns-from.patch deleted file mode 100644 index c894035..0000000 --- a/0001-QMimeDatabase-collect-glob-patterns-from.patch +++ /dev/null @@ -1,1169 +0,0 @@ -From 705118a554083161b6fe54aaf37a04ddca844f48 Mon Sep 17 00:00:00 2001 -From: David Faure -Date: Thu, 07 Dec 2023 11:38:38 +0100 -Subject: [PATCH] QMimeDatabase: collect glob patterns from all locations - -A QMimeTypePrivate used to belong to a single provider, which would -provide the complete data for it. -But since the redesign in commit 7a5644d6481a3c1a741677, each provider -represents is a single mime directory, and the merging happens at the -QMimeDatabase level. So we need a QMimeType[Private] to be just a name -(a "request" for information about this mimetype) and the information -for that mimetype is retrieved on demand by querying the providers -and either stopping at the first one (e.g. for icons) or merging -the data from all of them (e.g. for glob patterns). - -The XML provider was using QMimeTypePrivate as data storage, -give it its own struct QMimeTypeXMLData for that purpose instead. - -Task-number: QTBUG-116905 -Change-Id: Ia0e0d94aa899720dc0b908f40c25317473005af4 -(cherry picked from commit 4e9944e6c8a456353d243ab268cb0f01ff006faa) -Reviewed-by: Thiago Macieira ---- - -Index: qtbase-everywhere-src-6.6.1/src/corelib/mimetypes/qmimedatabase.cpp -=================================================================== ---- qtbase-everywhere-src-6.6.1.orig/src/corelib/mimetypes/qmimedatabase.cpp -+++ qtbase-everywhere-src-6.6.1/src/corelib/mimetypes/qmimedatabase.cpp -@@ -191,9 +191,8 @@ QMimeType QMimeDatabasePrivate::mimeType - { - const QString mimeName = resolveAlias(nameOrAlias); - for (const auto &provider : providers()) { -- QMimeType mime = provider->mimeTypeForName(mimeName); -- if (mime.isValid()) -- return mime; -+ if (provider->knowsMimeType(mimeName)) -+ return QMimeType(QMimeTypePrivate(mimeName)); - } - return {}; - } -@@ -218,54 +217,54 @@ QMimeGlobMatchResult QMimeDatabasePrivat - return result; - } - --void QMimeDatabasePrivate::loadMimeTypePrivate(QMimeTypePrivate &mimePrivate) -+QMimeTypePrivate::LocaleHash QMimeDatabasePrivate::localeComments(const QString &name) - { - QMutexLocker locker(&mutex); -- if (mimePrivate.name.isEmpty()) -- return; // invalid mimetype -- if (!mimePrivate.loaded) { // XML provider sets loaded=true, binary provider does this on demand -- Q_ASSERT(mimePrivate.fromCache); -- bool found = false; -- for (const auto &provider : providers()) { -- if (provider->loadMimeTypePrivate(mimePrivate)) { -- found = true; -- break; -- } -- } -- if (!found) { -- const QString file = mimePrivate.name + ".xml"_L1; -- qWarning() << "No file found for" << file << ", even though update-mime-info said it would exist.\n" -- "Either it was just removed, or the directory doesn't have executable permission..." -- << locateMimeDirectories(); -- } -- mimePrivate.loaded = true; -+ for (const auto &provider : providers()) { -+ auto comments = provider->localeComments(name); -+ if (!comments.isEmpty()) -+ return comments; // maybe we want to merge in comments from more global providers, in -+ // case of more translations? - } -+ return {}; - } - --void QMimeDatabasePrivate::loadGenericIcon(QMimeTypePrivate &mimePrivate) -+QStringList QMimeDatabasePrivate::globPatterns(const QString &name) - { - QMutexLocker locker(&mutex); -- if (mimePrivate.fromCache) { -- mimePrivate.genericIconName.clear(); -- for (const auto &provider : providers()) { -- provider->loadGenericIcon(mimePrivate); -- if (!mimePrivate.genericIconName.isEmpty()) -- break; -- } -+ QStringList patterns; -+ const auto &providerList = providers(); -+ // reverse iteration because we start from most global, add up, clear if delete-all, and add up -+ // again. -+ for (auto rit = providerList.rbegin(); rit != providerList.rend(); ++rit) { -+ auto *provider = rit->get(); -+ if (provider->hasGlobDeleteAll(name)) -+ patterns.clear(); -+ patterns += provider->globPatterns(name); - } -+ return patterns; - } - --void QMimeDatabasePrivate::loadIcon(QMimeTypePrivate &mimePrivate) -+QString QMimeDatabasePrivate::genericIcon(const QString &name) - { - QMutexLocker locker(&mutex); -- if (mimePrivate.fromCache) { -- mimePrivate.iconName.clear(); -- for (const auto &provider : providers()) { -- provider->loadIcon(mimePrivate); -- if (!mimePrivate.iconName.isEmpty()) -- break; -- } -+ for (const auto &provider : providers()) { -+ QString genericIconName = provider->genericIcon(name); -+ if (!genericIconName.isEmpty()) -+ return genericIconName; - } -+ return {}; -+} -+ -+QString QMimeDatabasePrivate::icon(const QString &name) -+{ -+ QMutexLocker locker(&mutex); -+ for (const auto &provider : providers()) { -+ QString iconName = provider->icon(name); -+ if (!iconName.isEmpty()) -+ return iconName; -+ } -+ return {}; - } - - QString QMimeDatabasePrivate::fallbackParent(const QString &mimeTypeName) const -@@ -346,12 +345,12 @@ QMimeType QMimeDatabasePrivate::findByDa - } - - *accuracyPtr = 0; -- QMimeType candidate; -+ QString candidate; - for (const auto &provider : providers()) -- provider->findByMagic(data, accuracyPtr, candidate); -+ provider->findByMagic(data, accuracyPtr, &candidate); - -- if (candidate.isValid()) -- return candidate; -+ if (!candidate.isEmpty()) -+ return QMimeType(QMimeTypePrivate(candidate)); - - if (isTextFile(data)) { - *accuracyPtr = 5; -Index: qtbase-everywhere-src-6.6.1/src/corelib/mimetypes/qmimedatabase_p.h -=================================================================== ---- qtbase-everywhere-src-6.6.1.orig/src/corelib/mimetypes/qmimedatabase_p.h -+++ qtbase-everywhere-src-6.6.1/src/corelib/mimetypes/qmimedatabase_p.h -@@ -66,9 +66,10 @@ public: - QMimeGlobMatchResult findByFileName(const QString &fileName); - - // API for QMimeType. Takes care of locking the mutex. -- void loadMimeTypePrivate(QMimeTypePrivate &mimePrivate); -- void loadGenericIcon(QMimeTypePrivate &mimePrivate); -- void loadIcon(QMimeTypePrivate &mimePrivate); -+ QMimeTypePrivate::LocaleHash localeComments(const QString &name); -+ QStringList globPatterns(const QString &name); -+ QString genericIcon(const QString &name); -+ QString icon(const QString &name); - QStringList mimeParents(const QString &mimeName); - QStringList listAliases(const QString &mimeName); - bool mimeInherits(const QString &mime, const QString &parent); -@@ -81,7 +82,7 @@ private: - QString fallbackParent(const QString &mimeTypeName) const; - - const QString m_defaultMimeType; -- mutable Providers m_providers; -+ mutable Providers m_providers; // most local first, most global last - QElapsedTimer m_lastCheck; - - public: -Index: qtbase-everywhere-src-6.6.1/src/corelib/mimetypes/qmimeprovider.cpp -=================================================================== ---- qtbase-everywhere-src-6.6.1.orig/src/corelib/mimetypes/qmimeprovider.cpp -+++ qtbase-everywhere-src-6.6.1/src/corelib/mimetypes/qmimeprovider.cpp -@@ -186,25 +186,11 @@ void QMimeBinaryProvider::ensureLoaded() - m_cacheFile.reset(); - } - --static QMimeType mimeTypeForNameUnchecked(const QString &name) --{ -- QMimeTypePrivate data; -- data.name = name; -- data.fromCache = true; -- // The rest is retrieved on demand. -- // comment and globPatterns: in loadMimeTypePrivate -- // iconName: in loadIcon -- // genericIconName: in loadGenericIcon -- return QMimeType(data); --} -- --QMimeType QMimeBinaryProvider::mimeTypeForName(const QString &name) -+bool QMimeBinaryProvider::knowsMimeType(const QString &name) - { - if (!m_mimetypeListLoaded) - loadMimeTypeList(); -- if (!m_mimetypeNames.contains(name)) -- return QMimeType(); // unknown mimetype -- return mimeTypeForNameUnchecked(name); -+ return m_mimetypeNames.contains(name); - } - - void QMimeBinaryProvider::addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result) -@@ -354,7 +340,7 @@ bool QMimeBinaryProvider::matchMagicRule - return false; - } - --void QMimeBinaryProvider::findByMagic(const QByteArray &data, int *accuracyPtr, QMimeType &candidate) -+void QMimeBinaryProvider::findByMagic(const QByteArray &data, int *accuracyPtr, QString *candidate) - { - const int magicListOffset = m_cacheFile->getUint32(PosMagicListOffset); - const int numMatches = m_cacheFile->getUint32(magicListOffset); -@@ -371,7 +357,7 @@ void QMimeBinaryProvider::findByMagic(co - *accuracyPtr = m_cacheFile->getUint32(off); - // Return the first match. We have no rules for conflicting magic data... - // (mime.cache itself is sorted, but what about local overrides with a lower prio?) -- candidate = mimeTypeForNameUnchecked(QLatin1StringView(mimeType)); -+ *candidate = QString::fromLatin1(mimeType); - return; - } - } -@@ -479,35 +465,63 @@ void QMimeBinaryProvider::addAllMimeType - if (result.isEmpty()) { - result.reserve(m_mimetypeNames.size()); - for (const QString &name : std::as_const(m_mimetypeNames)) -- result.append(mimeTypeForNameUnchecked(name)); -+ result.append(QMimeType(QMimeTypePrivate(name))); - } else { - for (const QString &name : std::as_const(m_mimetypeNames)) - if (std::find_if(result.constBegin(), result.constEnd(), [name](const QMimeType &mime) -> bool { return mime.name() == name; }) - == result.constEnd()) -- result.append(mimeTypeForNameUnchecked(name)); -+ result.append(QMimeType(QMimeTypePrivate(name))); - } - } - --bool QMimeBinaryProvider::loadMimeTypePrivate(QMimeTypePrivate &data) -+QMimeTypePrivate::LocaleHash QMimeBinaryProvider::localeComments(const QString &name) - { --#if QT_CONFIG(xmlstreamreader) -- if (data.loaded) -- return true; -+ MimeTypeExtraMap::const_iterator it = loadMimeTypeExtra(name); -+ if (it != m_mimetypeExtra.constEnd()) { -+ const MimeTypeExtra &e = it.value(); -+ return e.localeComments; -+ } -+ return {}; -+} -+ -+bool QMimeBinaryProvider::hasGlobDeleteAll(const QString &name) -+{ -+ MimeTypeExtraMap::const_iterator it = loadMimeTypeExtra(name); -+ if (it != m_mimetypeExtra.constEnd()) { -+ const MimeTypeExtra &e = it.value(); -+ return e.hasGlobDeleteAll; -+ } -+ return {}; -+} - -- auto it = m_mimetypeExtra.constFind(data.name); -+QStringList QMimeBinaryProvider::globPatterns(const QString &name) -+{ -+ MimeTypeExtraMap::const_iterator it = loadMimeTypeExtra(name); -+ if (it != m_mimetypeExtra.constEnd()) { -+ const MimeTypeExtra &e = it.value(); -+ return e.globPatterns; -+ } -+ return {}; -+} -+ -+QMimeBinaryProvider::MimeTypeExtraMap::const_iterator -+QMimeBinaryProvider::loadMimeTypeExtra(const QString &mimeName) -+{ -+#if QT_CONFIG(xmlstreamreader) -+ auto it = m_mimetypeExtra.constFind(mimeName); - if (it == m_mimetypeExtra.constEnd()) { - // load comment and globPatterns - - // shared-mime-info since 1.3 lowercases the xml files -- QString mimeFile = m_directory + u'/' + data.name.toLower() + ".xml"_L1; -+ QString mimeFile = m_directory + u'/' + mimeName.toLower() + ".xml"_L1; - if (!QFile::exists(mimeFile)) -- mimeFile = m_directory + u'/' + data.name + ".xml"_L1; // pre-1.3 -+ mimeFile = m_directory + u'/' + mimeName + ".xml"_L1; // pre-1.3 - - QFile qfile(mimeFile); - if (!qfile.open(QFile::ReadOnly)) -- return false; -+ return m_mimetypeExtra.constEnd(); - -- auto insertIt = m_mimetypeExtra.insert(data.name, MimeTypeExtra{}); -+ auto insertIt = m_mimetypeExtra.insert(mimeName, MimeTypeExtra{}); - it = insertIt; - MimeTypeExtra &extra = insertIt.value(); - QString mainPattern; -@@ -515,13 +529,13 @@ bool QMimeBinaryProvider::loadMimeTypePr - QXmlStreamReader xml(&qfile); - if (xml.readNextStartElement()) { - if (xml.name() != "mime-type"_L1) { -- return false; -+ return m_mimetypeExtra.constEnd(); - } - const auto name = xml.attributes().value("type"_L1); - if (name.isEmpty()) -- return false; -- if (name.compare(data.name, Qt::CaseInsensitive)) -- qWarning() << "Got name" << name << "in file" << mimeFile << "expected" << data.name; -+ return m_mimetypeExtra.constEnd(); -+ if (name.compare(mimeName, Qt::CaseInsensitive)) -+ qWarning() << "Got name" << name << "in file" << mimeFile << "expected" << mimeName; - - while (xml.readNextStartElement()) { - const auto tag = xml.name(); -@@ -534,8 +548,7 @@ bool QMimeBinaryProvider::loadMimeTypePr - extra.localeComments.insert(lang, text); - continue; // we called readElementText, so we're at the EndElement already. - } else if (tag == "glob-deleteall"_L1) { // as written out by shared-mime-info >= 0.70 -- extra.globPatterns.clear(); -- mainPattern.clear(); -+ extra.hasGlobDeleteAll = true; - } else if (tag == "glob"_L1) { // as written out by shared-mime-info >= 0.70 - const QString pattern = xml.attributes().value("pattern"_L1).toString(); - if (mainPattern.isEmpty() && pattern.startsWith(u'*')) { -@@ -557,14 +570,11 @@ bool QMimeBinaryProvider::loadMimeTypePr - extra.globPatterns.prepend(mainPattern); - } - } -- const MimeTypeExtra &e = it.value(); -- data.localeComments = e.localeComments; -- data.globPatterns = e.globPatterns; -- return true; -+ return it; - #else -- Q_UNUSED(data); -+ Q_UNUSED(mimeName); - qWarning("Cannot load mime type since QXmlStreamReader is not available."); -- return false; -+ return m_mimetypeExtra.constEnd(); - #endif // feature xmlstreamreader - } - -@@ -594,22 +604,16 @@ QLatin1StringView QMimeBinaryProvider::i - return QLatin1StringView(); - } - --void QMimeBinaryProvider::loadIcon(QMimeTypePrivate &data) -+QString QMimeBinaryProvider::icon(const QString &name) - { -- const QByteArray inputMime = data.name.toLatin1(); -- const QLatin1StringView icon = iconForMime(m_cacheFile.get(), PosIconsListOffset, inputMime); -- if (!icon.isEmpty()) { -- data.iconName = icon; -- } -+ const QByteArray inputMime = name.toLatin1(); -+ return iconForMime(m_cacheFile.get(), PosIconsListOffset, inputMime); - } - --void QMimeBinaryProvider::loadGenericIcon(QMimeTypePrivate &data) -+QString QMimeBinaryProvider::genericIcon(const QString &name) - { -- const QByteArray inputMime = data.name.toLatin1(); -- const QLatin1StringView icon = iconForMime(m_cacheFile.get(), PosGenericIconsListOffset, inputMime); -- if (!icon.isEmpty()) { -- data.genericIconName = icon; -- } -+ const QByteArray inputMime = name.toLatin1(); -+ return iconForMime(m_cacheFile.get(), PosGenericIconsListOffset, inputMime); - } - - //// -@@ -694,9 +698,9 @@ bool QMimeXMLProvider::isInternalDatabas - #endif - } - --QMimeType QMimeXMLProvider::mimeTypeForName(const QString &name) -+bool QMimeXMLProvider::knowsMimeType(const QString &name) - { -- return m_nameMimeTypeMap.value(name); -+ return m_nameMimeTypeMap.contains(name); - } - - void QMimeXMLProvider::addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result) -@@ -704,22 +708,17 @@ void QMimeXMLProvider::addFileNameMatche - m_mimeTypeGlobs.matchingGlobs(fileName, result); - } - --void QMimeXMLProvider::findByMagic(const QByteArray &data, int *accuracyPtr, QMimeType &candidate) -+void QMimeXMLProvider::findByMagic(const QByteArray &data, int *accuracyPtr, QString *candidate) - { -- QString candidateName; -- bool foundOne = false; - for (const QMimeMagicRuleMatcher &matcher : std::as_const(m_magicMatchers)) { - if (matcher.matches(data)) { - const int priority = matcher.priority(); - if (priority > *accuracyPtr) { - *accuracyPtr = priority; -- candidateName = matcher.mimetype(); -- foundOne = true; -+ *candidate = matcher.mimetype(); - } - } - } -- if (foundOne) -- candidate = mimeTypeForName(candidateName); - } - - void QMimeXMLProvider::ensureLoaded() -@@ -749,6 +748,31 @@ void QMimeXMLProvider::ensureLoaded() - load(file); - } - -+QMimeTypePrivate::LocaleHash QMimeXMLProvider::localeComments(const QString &name) -+{ -+ return m_nameMimeTypeMap.value(name).localeComments; -+} -+ -+bool QMimeXMLProvider::hasGlobDeleteAll(const QString &name) -+{ -+ return m_nameMimeTypeMap.value(name).hasGlobDeleteAll; -+} -+ -+QStringList QMimeXMLProvider::globPatterns(const QString &name) -+{ -+ return m_nameMimeTypeMap.value(name).globPatterns; -+} -+ -+QString QMimeXMLProvider::icon(const QString &name) -+{ -+ return m_nameMimeTypeMap.value(name).iconName; -+} -+ -+QString QMimeXMLProvider::genericIcon(const QString &name) -+{ -+ return m_nameMimeTypeMap.value(name).genericIconName; -+} -+ - void QMimeXMLProvider::load(const QString &fileName) - { - QString errorMessage; -@@ -790,14 +814,11 @@ void QMimeXMLProvider::addGlobPattern(co - m_mimeTypeGlobs.addGlob(glob); - } - --void QMimeXMLProvider::addMimeType(const QMimeType &mt) -+void QMimeXMLProvider::addMimeType(const QMimeTypeXMLData &mt) - { -- Q_ASSERT(!mt.d.data()->fromCache); -- -- QString name = mt.name(); -- if (mt.d->hasGlobDeleteAll) -- appendIfNew(m_mimeTypesWithDeletedGlobs, name); -- m_nameMimeTypeMap.insert(mt.name(), mt); -+ if (mt.hasGlobDeleteAll) -+ appendIfNew(m_mimeTypesWithDeletedGlobs, mt.name); -+ m_nameMimeTypeMap.insert(mt.name, mt); - } - - /* -@@ -813,7 +834,7 @@ void QMimeXMLProvider::excludeMimeTypeGl - for (const auto &mt : toExclude) { - auto it = m_nameMimeTypeMap.find(mt); - if (it != m_nameMimeTypeMap.end()) -- it->d->globPatterns.clear(); -+ it->globPatterns.clear(); - m_mimeTypeGlobs.removeMimeType(mt); - } - } -@@ -853,13 +874,16 @@ void QMimeXMLProvider::addAlias(const QS - void QMimeXMLProvider::addAllMimeTypes(QList &result) - { - if (result.isEmpty()) { // fast path -- result = m_nameMimeTypeMap.values(); -+ for (auto it = m_nameMimeTypeMap.constBegin(), end = m_nameMimeTypeMap.constEnd(); -+ it != end; ++it) { -+ result.append(QMimeType(QMimeTypePrivate(it.value().name))); -+ } - } else { - for (auto it = m_nameMimeTypeMap.constBegin(), end = m_nameMimeTypeMap.constEnd() ; it != end ; ++it) { - const QString newMime = it.key(); - if (std::find_if(result.constBegin(), result.constEnd(), [newMime](const QMimeType &mime) -> bool { return mime.name() == newMime; }) - == result.constEnd()) -- result.append(it.value()); -+ result.append(QMimeType(QMimeTypePrivate(it.value().name))); - } - } - } -Index: qtbase-everywhere-src-6.6.1/src/corelib/mimetypes/qmimeprovider_p.h -=================================================================== ---- qtbase-everywhere-src-6.6.1.orig/src/corelib/mimetypes/qmimeprovider_p.h -+++ qtbase-everywhere-src-6.6.1/src/corelib/mimetypes/qmimeprovider_p.h -@@ -28,6 +28,7 @@ QT_REQUIRE_CONFIG(mimetype); - QT_BEGIN_NAMESPACE - - class QMimeMagicRuleMatcher; -+class QMimeTypeXMLData; - - class QMimeProviderBase - { -@@ -39,18 +40,20 @@ public: - - virtual bool isValid() = 0; - virtual bool isInternalDatabase() const = 0; -- virtual QMimeType mimeTypeForName(const QString &name) = 0; -+ virtual bool knowsMimeType(const QString &name) = 0; - virtual void addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result) = 0; - virtual void addParents(const QString &mime, QStringList &result) = 0; - virtual QString resolveAlias(const QString &name) = 0; - virtual void addAliases(const QString &name, QStringList &result) = 0; -- virtual void findByMagic(const QByteArray &data, int *accuracyPtr, QMimeType &candidate) = 0; -+ virtual void findByMagic(const QByteArray &data, int *accuracyPtr, QString *candidate) = 0; - virtual void addAllMimeTypes(QList &result) = 0; -- virtual bool loadMimeTypePrivate(QMimeTypePrivate &) { return false; } -- virtual void loadIcon(QMimeTypePrivate &) {} -- virtual void loadGenericIcon(QMimeTypePrivate &) {} -- virtual void ensureLoaded() {} -- virtual void excludeMimeTypeGlobs(const QStringList &) {} -+ virtual QMimeTypePrivate::LocaleHash localeComments(const QString &name) = 0; -+ virtual bool hasGlobDeleteAll(const QString &name) = 0; -+ virtual QStringList globPatterns(const QString &name) = 0; -+ virtual QString icon(const QString &name) = 0; -+ virtual QString genericIcon(const QString &name) = 0; -+ virtual void ensureLoaded() { } -+ virtual void excludeMimeTypeGlobs(const QStringList &) { } - - QString directory() const { return m_directory; } - -@@ -60,9 +63,9 @@ public: - /* - MimeTypes with "glob-deleteall" tags are handled differently by each provider - sub-class: -- - QMimeBinaryProvider parses glob-deleteall tags lazily, i.e. only when loadMimeTypePrivate() -+ - QMimeBinaryProvider parses glob-deleteall tags lazily, i.e. only when hasGlobDeleteAll() - is called, and clears the glob patterns associated with mimetypes that have this tag -- - QMimeXMLProvider parses glob-deleteall from the the start, i.e. when a XML file is -+ - QMimeXMLProvider parses glob-deleteall from the start, i.e. when a XML file is - parsed with QMimeTypeParser - - The two lists below are used to let both provider types (XML and Binary) communicate -@@ -95,16 +98,18 @@ public: - - bool isValid() override; - bool isInternalDatabase() const override; -- QMimeType mimeTypeForName(const QString &name) override; -+ bool knowsMimeType(const QString &name) override; - void addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result) override; - void addParents(const QString &mime, QStringList &result) override; - QString resolveAlias(const QString &name) override; - void addAliases(const QString &name, QStringList &result) override; -- void findByMagic(const QByteArray &data, int *accuracyPtr, QMimeType &candidate) override; -+ void findByMagic(const QByteArray &data, int *accuracyPtr, QString *candidate) override; - void addAllMimeTypes(QList &result) override; -- bool loadMimeTypePrivate(QMimeTypePrivate &) override; -- void loadIcon(QMimeTypePrivate &) override; -- void loadGenericIcon(QMimeTypePrivate &) override; -+ QMimeTypePrivate::LocaleHash localeComments(const QString &name) override; -+ bool hasGlobDeleteAll(const QString &name) override; -+ QStringList globPatterns(const QString &name) override; -+ QString icon(const QString &name) override; -+ QString genericIcon(const QString &name) override; - void ensureLoaded() override; - void excludeMimeTypeGlobs(const QStringList &toExclude) override; - -@@ -116,8 +121,9 @@ private: - bool matchSuffixTree(QMimeGlobMatchResult &result, CacheFile *cacheFile, int numEntries, - int firstOffset, const QString &fileName, qsizetype charPos, - bool caseSensitiveCheck); -- bool matchMagicRule(CacheFile *cacheFile, int numMatchlets, int firstOffset, const QByteArray &data); - bool isMimeTypeGlobsExcluded(const char *name); -+ bool matchMagicRule(CacheFile *cacheFile, int numMatchlets, int firstOffset, -+ const QByteArray &data); - QLatin1StringView iconForMime(CacheFile *cacheFile, int posListOffset, const QByteArray &inputMime); - void loadMimeTypeList(); - bool checkCacheChanged(); -@@ -128,11 +134,14 @@ private: - bool m_mimetypeListLoaded; - struct MimeTypeExtra - { -- // Both retrieved on demand in loadMimeTypePrivate - QHash localeComments; - QStringList globPatterns; -+ bool hasGlobDeleteAll = false; - }; -- QMap m_mimetypeExtra; -+ using MimeTypeExtraMap = QMap; -+ MimeTypeExtraMap m_mimetypeExtra; -+ -+ MimeTypeExtraMap::const_iterator loadMimeTypeExtra(const QString &mimeName); - }; - - /* -@@ -153,19 +162,24 @@ public: - - bool isValid() override; - bool isInternalDatabase() const override; -- QMimeType mimeTypeForName(const QString &name) override; -+ bool knowsMimeType(const QString &name) override; - void addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result) override; - void addParents(const QString &mime, QStringList &result) override; - QString resolveAlias(const QString &name) override; - void addAliases(const QString &name, QStringList &result) override; -- void findByMagic(const QByteArray &data, int *accuracyPtr, QMimeType &candidate) override; -+ void findByMagic(const QByteArray &data, int *accuracyPtr, QString *candidate) override; - void addAllMimeTypes(QList &result) override; - void ensureLoaded() override; -+ QMimeTypePrivate::LocaleHash localeComments(const QString &name) override; -+ bool hasGlobDeleteAll(const QString &name) override; -+ QStringList globPatterns(const QString &name) override; -+ QString icon(const QString &name) override; -+ QString genericIcon(const QString &name) override; - - bool load(const QString &fileName, QString *errorMessage); - - // Called by the mimetype xml parser -- void addMimeType(const QMimeType &mt); -+ void addMimeType(const QMimeTypeXMLData &mt); - void excludeMimeTypeGlobs(const QStringList &toExclude) override; - void addGlobPattern(const QMimeGlobPattern &glob); - void addParent(const QString &child, const QString &parent); -@@ -176,7 +190,7 @@ private: - void load(const QString &fileName); - void load(const char *data, qsizetype len); - -- typedef QHash NameMimeTypeMap; -+ typedef QHash NameMimeTypeMap; - NameMimeTypeMap m_nameMimeTypeMap; - - typedef QHash AliasHash; -Index: qtbase-everywhere-src-6.6.1/src/corelib/mimetypes/qmimetype.cpp -=================================================================== ---- qtbase-everywhere-src-6.6.1.orig/src/corelib/mimetypes/qmimetype.cpp -+++ qtbase-everywhere-src-6.6.1/src/corelib/mimetypes/qmimetype.cpp -@@ -6,9 +6,6 @@ - - #include "qmimetype_p.h" - #include "qmimedatabase_p.h" --#include "qmimeprovider_p.h" -- --#include "qmimeglobpattern_p.h" - - #include - #include -@@ -20,33 +17,6 @@ QT_BEGIN_NAMESPACE - - using namespace Qt::StringLiterals; - --QMimeTypePrivate::QMimeTypePrivate() -- : loaded(false), fromCache(false) --{} -- --QMimeTypePrivate::QMimeTypePrivate(const QMimeType &other) -- : loaded(other.d->loaded), -- name(other.d->name), -- localeComments(other.d->localeComments), -- genericIconName(other.d->genericIconName), -- iconName(other.d->iconName), -- globPatterns(other.d->globPatterns) --{} -- --void QMimeTypePrivate::clear() --{ -- name.clear(); -- localeComments.clear(); -- genericIconName.clear(); -- iconName.clear(); -- globPatterns.clear(); --} -- --void QMimeTypePrivate::addGlobPattern(const QString &pattern) --{ -- globPatterns.append(pattern); --} -- - /*! - \class QMimeType - \inmodule QtCore -@@ -219,7 +189,7 @@ QString QMimeType::name() const - */ - QString QMimeType::comment() const - { -- QMimeDatabasePrivate::instance()->loadMimeTypePrivate(const_cast(*d)); -+ const auto localeComments = QMimeDatabasePrivate::instance()->localeComments(d->name); - - QStringList languageList = QLocale().uiLanguages(); - qsizetype defaultIndex = languageList.indexOf(u"en-US"_s); -@@ -244,13 +214,13 @@ QString QMimeType::comment() const - // uiLanguages() uses '-' as separator, MIME database uses '_' - const QString lang - = language == "C"_L1 ? u"en_US"_s : QString(language).replace(u'-', u'_'); -- QString comm = d->localeComments.value(lang); -+ QString comm = localeComments.value(lang); - if (!comm.isEmpty()) - return comm; - const qsizetype cut = lang.indexOf(u'_'); - // If "de_CH" is missing, check for "de" (and similar): - if (cut != -1) { -- comm = d->localeComments.value(lang.left(cut)); -+ comm = localeComments.value(lang.left(cut)); - if (!comm.isEmpty()) - return comm; - } -@@ -276,8 +246,8 @@ QString QMimeType::comment() const - */ - QString QMimeType::genericIconName() const - { -- QMimeDatabasePrivate::instance()->loadGenericIcon(const_cast(*d)); -- if (d->genericIconName.isEmpty()) { -+ QString genericIconName = QMimeDatabasePrivate::instance()->genericIcon(d->name); -+ if (genericIconName.isEmpty()) { - // From the spec: - // If the generic icon name is empty (not specified by the mimetype definition) - // then the mimetype is used to generate the generic icon by using the top-level -@@ -290,7 +260,7 @@ QString QMimeType::genericIconName() con - groupRef = groupRef.left(slashindex); - return groupRef + "-x-generic"_L1; - } -- return d->genericIconName; -+ return genericIconName; - } - - static QString make_default_icon_name_from_mimetype_name(QString iconName) -@@ -312,11 +282,11 @@ static QString make_default_icon_name_fr - */ - QString QMimeType::iconName() const - { -- QMimeDatabasePrivate::instance()->loadIcon(const_cast(*d)); -- if (d->iconName.isEmpty()) { -+ QString iconName = QMimeDatabasePrivate::instance()->icon(d->name); -+ if (iconName.isEmpty()) { - return make_default_icon_name_from_mimetype_name(name()); - } -- return d->iconName; -+ return iconName; - } - - /*! -@@ -328,8 +298,7 @@ QString QMimeType::iconName() const - */ - QStringList QMimeType::globPatterns() const - { -- QMimeDatabasePrivate::instance()->loadMimeTypePrivate(const_cast(*d)); -- return d->globPatterns; -+ return QMimeDatabasePrivate::instance()->globPatterns(d->name); - } - - /*! -@@ -426,10 +395,11 @@ QStringList QMimeType::aliases() const - */ - QStringList QMimeType::suffixes() const - { -- QMimeDatabasePrivate::instance()->loadMimeTypePrivate(const_cast(*d)); -+ const QStringList patterns = globPatterns(); - - QStringList result; -- for (const QString &pattern : std::as_const(d->globPatterns)) { -+ result.reserve(patterns.size()); -+ for (const QString &pattern : patterns) { - // Not a simple suffix if it looks like: README or *. or *.* or *.JP*G or *.JP? - if (pattern.startsWith("*."_L1) && - pattern.size() > 2 && -@@ -469,15 +439,15 @@ QString QMimeType::preferredSuffix() con - */ - QString QMimeType::filterString() const - { -- QMimeDatabasePrivate::instance()->loadMimeTypePrivate(const_cast(*d)); -+ const QStringList patterns = globPatterns(); - QString filter; - -- if (!d->globPatterns.empty()) { -+ if (!patterns.empty()) { - filter += comment() + " ("_L1; -- for (int i = 0; i < d->globPatterns.size(); ++i) { -+ for (int i = 0; i < patterns.size(); ++i) { - if (i != 0) - filter += u' '; -- filter += d->globPatterns.at(i); -+ filter += patterns.at(i); - } - filter += u')'; - } -Index: qtbase-everywhere-src-6.6.1/src/corelib/mimetypes/qmimetype_p.h -=================================================================== ---- qtbase-everywhere-src-6.6.1.orig/src/corelib/mimetypes/qmimetype_p.h -+++ qtbase-everywhere-src-6.6.1/src/corelib/mimetypes/qmimetype_p.h -@@ -16,13 +16,14 @@ - // - - #include --#include "qmimetype.h" -+#include - - QT_REQUIRE_CONFIG(mimetype); - - #include - #include - -+class QMimeBinaryProvider; - QT_BEGIN_NAMESPACE - - class Q_AUTOTEST_EXPORT QMimeTypePrivate : public QSharedData -@@ -30,42 +31,12 @@ class Q_AUTOTEST_EXPORT QMimeTypePrivate - public: - typedef QHash LocaleHash; - -- QMimeTypePrivate(); -- explicit QMimeTypePrivate(const QMimeType &other); -+ QMimeTypePrivate() { } -+ explicit QMimeTypePrivate(const QString &name) : name(name) { } - -- void clear(); -- -- void addGlobPattern(const QString &pattern); -- -- bool loaded; // QSharedData leaves a 4 byte gap, so don't put 8 byte members first -- bool fromCache; // true if this comes from the binary provider -- bool hasGlobDeleteAll = false; // true if the mimetype has a glob-deleteall tag - QString name; -- LocaleHash localeComments; -- QString genericIconName; -- QString iconName; -- QStringList globPatterns; - }; - - QT_END_NAMESPACE - --#define QMIMETYPE_BUILDER_FROM_RVALUE_REFS \ -- QT_BEGIN_NAMESPACE \ -- static QMimeType buildQMimeType ( \ -- QString &&name, \ -- QString &&genericIconName, \ -- QString &&iconName, \ -- QStringList &&globPatterns \ -- ) \ -- { \ -- QMimeTypePrivate qMimeTypeData; \ -- qMimeTypeData.loaded = true; \ -- qMimeTypeData.name = std::move(name); \ -- qMimeTypeData.genericIconName = std::move(genericIconName); \ -- qMimeTypeData.iconName = std::move(iconName); \ -- qMimeTypeData.globPatterns = std::move(globPatterns); \ -- return QMimeType(qMimeTypeData); \ -- } \ -- QT_END_NAMESPACE -- --#endif // QMIMETYPE_P_H -+#endif // QMIMETYPE_P_H -Index: qtbase-everywhere-src-6.6.1/src/corelib/mimetypes/qmimetypeparser.cpp -=================================================================== ---- qtbase-everywhere-src-6.6.1.orig/src/corelib/mimetypes/qmimetypeparser.cpp -+++ qtbase-everywhere-src-6.6.1/src/corelib/mimetypes/qmimetypeparser.cpp -@@ -165,8 +165,7 @@ static CreateMagicMatchRuleResult create - bool QMimeTypeParserBase::parse(QIODevice *dev, const QString &fileName, QString *errorMessage) - { - #if QT_CONFIG(xmlstreamreader) -- QMimeTypePrivate data; -- data.loaded = true; -+ QMimeTypeXMLData data; - int priority = 50; - QStack currentRules; // stack for the nesting of rules - QList rules; // toplevel rules -@@ -273,7 +272,7 @@ bool QMimeTypeParserBase::parse(QIODevic - { - const auto elementName = reader.name(); - if (elementName == QLatin1StringView(mimeTypeTagC)) { -- if (!process(QMimeType(data), errorMessage)) -+ if (!process(data, errorMessage)) - return false; - data.clear(); - } else if (elementName == QLatin1StringView(matchTagC)) { -@@ -314,4 +313,19 @@ bool QMimeTypeParserBase::parse(QIODevic - #endif // feature xmlstreamreader - } - -+void QMimeTypeXMLData::clear() -+{ -+ hasGlobDeleteAll = false; -+ name.clear(); -+ localeComments.clear(); -+ genericIconName.clear(); -+ iconName.clear(); -+ globPatterns.clear(); -+} -+ -+void QMimeTypeXMLData::addGlobPattern(const QString &pattern) -+{ -+ globPatterns.append(pattern); -+} -+ - QT_END_NAMESPACE -Index: qtbase-everywhere-src-6.6.1/src/corelib/mimetypes/qmimetypeparser_p.h -=================================================================== ---- qtbase-everywhere-src-6.6.1.orig/src/corelib/mimetypes/qmimetypeparser_p.h -+++ qtbase-everywhere-src-6.6.1/src/corelib/mimetypes/qmimetypeparser_p.h -@@ -16,7 +16,7 @@ - // We mean it. - // - --#include "qmimedatabase_p.h" -+#include - - QT_REQUIRE_CONFIG(mimetype); - -@@ -24,6 +24,21 @@ QT_REQUIRE_CONFIG(mimetype); - - QT_BEGIN_NAMESPACE - -+class QMimeTypeXMLData -+{ -+public: -+ void clear(); -+ -+ void addGlobPattern(const QString &pattern); -+ -+ bool hasGlobDeleteAll = false; // true if the mimetype has a glob-deleteall tag -+ QString name; -+ QMimeTypePrivate::LocaleHash localeComments; -+ QString genericIconName; // TODO move to a struct that's specific to the XML provider -+ QString iconName; // TODO move to a struct that's specific to the XML provider -+ QStringList globPatterns; -+}; -+ - class QIODevice; - - class QMimeTypeParserBase -@@ -39,7 +54,7 @@ public: - static bool parseNumber(QStringView n, int *target, QString *errorMessage); - - protected: -- virtual bool process(const QMimeType &t, QString *errorMessage) = 0; -+ virtual bool process(const QMimeTypeXMLData &t, QString *errorMessage) = 0; - virtual bool process(const QMimeGlobPattern &t, QString *errorMessage) = 0; - virtual void processParent(const QString &child, const QString &parent) = 0; - virtual void processAlias(const QString &alias, const QString &name) = 0; -@@ -73,7 +88,7 @@ public: - explicit QMimeTypeParser(QMimeXMLProvider &provider) : m_provider(provider) {} - - protected: -- inline bool process(const QMimeType &t, QString *) override -+ inline bool process(const QMimeTypeXMLData &t, QString *) override - { m_provider.addMimeType(t); return true; } - - inline bool process(const QMimeGlobPattern &glob, QString *) override -Index: qtbase-everywhere-src-6.6.1/tests/auto/corelib/mimetypes/qmimedatabase/add-extension.xml -=================================================================== ---- /dev/null -+++ qtbase-everywhere-src-6.6.1/tests/auto/corelib/mimetypes/qmimedatabase/add-extension.xml -@@ -0,0 +1,7 @@ -+ -+ -+ -+ -+ JPEG Image -+ -+ -Index: qtbase-everywhere-src-6.6.1/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/CMakeLists.txt -=================================================================== ---- qtbase-everywhere-src-6.6.1.orig/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/CMakeLists.txt -+++ qtbase-everywhere-src-6.6.1/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/CMakeLists.txt -@@ -24,6 +24,7 @@ qt_internal_add_test(tst_qmimedatabase-c - #) - set(testdata_resource_files - "../circular-inheritance.xml" -+ "../add-extension.xml" - "../invalid-magic1.xml" - "../invalid-magic2.xml" - "../invalid-magic3.xml" -Index: qtbase-everywhere-src-6.6.1/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/CMakeLists.txt -=================================================================== ---- qtbase-everywhere-src-6.6.1.orig/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/CMakeLists.txt -+++ qtbase-everywhere-src-6.6.1/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/CMakeLists.txt -@@ -24,6 +24,7 @@ qt_internal_add_test(tst_qmimedatabase-x - #) - set(testdata_resource_files - "../circular-inheritance.xml" -+ "../add-extension.xml" - "../invalid-magic1.xml" - "../invalid-magic2.xml" - "../invalid-magic3.xml" -Index: qtbase-everywhere-src-6.6.1/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp -=================================================================== ---- qtbase-everywhere-src-6.6.1.orig/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp -+++ qtbase-everywhere-src-6.6.1/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp -@@ -30,7 +30,8 @@ - - using namespace Qt::StringLiterals; - --static const char *const additionalMimeFiles[] = { "yast2-metapackage-handler-mimetypes.xml", -+static const char *const additionalMimeFiles[] = { "add-extension.xml", // adds *.jnewext to image/jpeg -+ "yast2-metapackage-handler-mimetypes.xml", - "qml-again.xml", - "text-x-objcsrc.xml", - "text-plain-subclass.xml", -@@ -1214,6 +1215,11 @@ void tst_QMimeDatabase::installNewLocalM - QCOMPARE(db.mimeTypeForFile(qmlTestFile).name(), - QString::fromLatin1("text/x-qml")); - -+ // QTBUG-116905: globPatterns() should merge all locations -+ // add-extension.xml adds *.jnewext -+ const QStringList expectedJpegPatterns{ "*.jpg", "*.jpeg", "*.jpe", "*.jnewext" }; -+ QCOMPARE(db.mimeTypeForName(QStringLiteral("image/jpeg")).globPatterns(), expectedJpegPatterns); -+ - // Now that we have two directories with mime definitions, check that everything still works - inheritance(); - if (QTest::currentTestFailed()) -Index: qtbase-everywhere-src-6.6.1/tests/auto/corelib/mimetypes/qmimetype/tst_qmimetype.cpp -=================================================================== ---- qtbase-everywhere-src-6.6.1.orig/tests/auto/corelib/mimetypes/qmimetype/tst_qmimetype.cpp -+++ qtbase-everywhere-src-6.6.1/tests/auto/corelib/mimetypes/qmimetype/tst_qmimetype.cpp -@@ -21,7 +21,6 @@ private slots: - void name(); - void genericIconName(); - void iconName(); -- void suffixes(); - void gadget(); - }; - -@@ -36,52 +35,15 @@ void tst_qmimetype::initTestCase() - - static QString qMimeTypeName() - { -- static const QString result ("No name of the MIME type"); -- return result; --} -- --static QString qMimeTypeGenericIconName() --{ -- static const QString result ("No file name of an icon image that represents the MIME type"); -- return result; --} -- --static QString qMimeTypeIconName() --{ -- static const QString result ("No file name of an icon image that represents the MIME type"); -- return result; --} -- --static QStringList buildQMimeTypeFilenameExtensions() --{ -- QStringList result; -- result << QString::fromLatin1("*.png"); -- return result; --} -- --static QStringList qMimeTypeGlobPatterns() --{ -- static const QStringList result (buildQMimeTypeFilenameExtensions()); -+ static const QString result("group/fake-mime"); - return result; - } - - // ------------------------------------------------------------------------------------------------ - --QMIMETYPE_BUILDER_FROM_RVALUE_REFS -- --// ------------------------------------------------------------------------------------------------ -- - void tst_qmimetype::isValid() - { -- QMimeType instantiatedQMimeType ( -- buildQMimeType ( -- qMimeTypeName(), -- qMimeTypeGenericIconName(), -- qMimeTypeIconName(), -- qMimeTypeGlobPatterns() -- ) -- ); -- -+ QMimeType instantiatedQMimeType{ QMimeTypePrivate(qMimeTypeName()) }; - QVERIFY(instantiatedQMimeType.isValid()); - - QMimeType otherQMimeType (instantiatedQMimeType); -@@ -98,23 +60,8 @@ void tst_qmimetype::isValid() - - void tst_qmimetype::name() - { -- QMimeType instantiatedQMimeType ( -- buildQMimeType ( -- qMimeTypeName(), -- qMimeTypeGenericIconName(), -- qMimeTypeIconName(), -- qMimeTypeGlobPatterns() -- ) -- ); -- -- QMimeType otherQMimeType ( -- buildQMimeType ( -- QString(), -- qMimeTypeGenericIconName(), -- qMimeTypeIconName(), -- qMimeTypeGlobPatterns() -- ) -- ); -+ QMimeType instantiatedQMimeType{ QMimeTypePrivate(qMimeTypeName()) }; -+ QMimeType otherQMimeType{ QMimeTypePrivate(QString()) }; - - // Verify that the Name is part of the equality test: - QCOMPARE(instantiatedQMimeType.name(), qMimeTypeName()); -@@ -127,63 +74,23 @@ void tst_qmimetype::name() - - void tst_qmimetype::genericIconName() - { -- QMimeType instantiatedQMimeType ( -- buildQMimeType ( -- qMimeTypeName(), -- qMimeTypeGenericIconName(), -- qMimeTypeIconName(), -- qMimeTypeGlobPatterns() -- ) -- ); -- -- QCOMPARE(instantiatedQMimeType.genericIconName(), qMimeTypeGenericIconName()); -+ const QMimeType instantiatedQMimeType{ QMimeTypePrivate(qMimeTypeName()) }; -+ QCOMPARE(instantiatedQMimeType.genericIconName(), "group-x-generic"); - } - - // ------------------------------------------------------------------------------------------------ - - void tst_qmimetype::iconName() - { -- QMimeType instantiatedQMimeType ( -- buildQMimeType ( -- qMimeTypeName(), -- qMimeTypeGenericIconName(), -- qMimeTypeIconName(), -- qMimeTypeGlobPatterns() -- ) -- ); -- -- QCOMPARE(instantiatedQMimeType.iconName(), qMimeTypeIconName()); --} -- --// ------------------------------------------------------------------------------------------------ -- --void tst_qmimetype::suffixes() --{ -- QMimeType instantiatedQMimeType ( -- buildQMimeType ( -- qMimeTypeName(), -- qMimeTypeGenericIconName(), -- qMimeTypeIconName(), -- qMimeTypeGlobPatterns() -- ) -- ); -- -- QCOMPARE(instantiatedQMimeType.globPatterns(), qMimeTypeGlobPatterns()); -- QCOMPARE(instantiatedQMimeType.suffixes(), QStringList() << QString::fromLatin1("png")); -+ const QMimeType instantiatedQMimeType{ QMimeTypePrivate(qMimeTypeName()) }; -+ QCOMPARE(instantiatedQMimeType.iconName(), "group-fake-mime"); - } - - // ------------------------------------------------------------------------------------------------ - - void tst_qmimetype::gadget() - { -- QMimeType instantiatedQMimeType ( -- buildQMimeType ( -- qMimeTypeName(), -- qMimeTypeGenericIconName(), -- qMimeTypeIconName(), -- qMimeTypeGlobPatterns() -- ) -- ); -+ QMimeType instantiatedQMimeType = QMimeDatabase().mimeTypeForName("text/plain"); - - const QMetaObject *metaObject = &instantiatedQMimeType.staticMetaObject; - diff --git a/0001-QMimeDatabase-handle-buggy-type-definitions.patch b/0001-QMimeDatabase-handle-buggy-type-definitions.patch deleted file mode 100644 index 18db8b1..0000000 --- a/0001-QMimeDatabase-handle-buggy-type-definitions.patch +++ /dev/null @@ -1,162 +0,0 @@ -From 54656da9ace06caf4a0eeb1832989c0ab211a4a0 Mon Sep 17 00:00:00 2001 -From: Alex Henrie -Date: Wed, 15 Nov 2023 09:36:06 -0700 -Subject: QMimeDatabase: handle buggy type definitions with circular - inheritance - -This fixes an infinite loop reported by a user who had both the -definition of text/javascript from shared-mime-info 2.3 and the -definition of text/javascript from shared-mime-info 2.4 installed at the -same time. In 2.3, text/javascript is a subtype of -application/ecmascript, but in 2.4 application/ecmascript is a subtype -of text/javascript. Having both at the same time resulted in circular -inheritance. - -https://gitlab.freedesktop.org/xdg/shared-mime-info/-/merge_requests/258#note_2167707 - -[ChangeLog][QtCore][QMimeDatabase] Added code to detect and break -circular inheritance loops in the MIME data, which were causing infinite -loops - -Pick-to: 6.6 6.5 -Change-Id: Ic207b1593a49c7bb88e4fd810d8f88aa630087ce -Reviewed-by: Thiago Macieira -Reviewed-by: David Faure ---- - src/corelib/mimetypes/qmimedatabase.cpp | 9 +++++++-- - src/corelib/mimetypes/qmimetype.cpp | 7 +++++-- - .../mimetypes/qmimedatabase/circular-inheritance.xml | 13 +++++++++++++ - .../qmimedatabase/qmimedatabase-cache/CMakeLists.txt | 1 + - .../qmimedatabase/qmimedatabase-xml/CMakeLists.txt | 1 + - .../corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp | 8 ++++++++ - 6 files changed, 35 insertions(+), 4 deletions(-) - create mode 100644 tests/auto/corelib/mimetypes/qmimedatabase/circular-inheritance.xml - -diff --git a/src/corelib/mimetypes/qmimedatabase.cpp b/src/corelib/mimetypes/qmimedatabase.cpp -index f06a434d55..eaeb079c97 100644 ---- a/src/corelib/mimetypes/qmimedatabase.cpp -+++ b/src/corelib/mimetypes/qmimedatabase.cpp -@@ -10,6 +10,7 @@ - #include "qmimeprovider_p.h" - #include "qmimetype_p.h" - -+#include - #include - - #include -@@ -503,6 +504,7 @@ QList QMimeDatabasePrivate::allMimeTypes() - bool QMimeDatabasePrivate::inherits(const QString &mime, const QString &parent) - { - const QString resolvedParent = resolveAlias(parent); -+ QDuplicateTracker seen; - std::stack toCheck; - toCheck.push(mime); - while (!toCheck.empty()) { -@@ -511,8 +513,11 @@ bool QMimeDatabasePrivate::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/corelib/mimetypes/qmimetype.cpp b/src/corelib/mimetypes/qmimetype.cpp -index bed9e94364..ad3c484f30 100644 ---- a/src/corelib/mimetypes/qmimetype.cpp -+++ b/src/corelib/mimetypes/qmimetype.cpp -@@ -325,14 +325,17 @@ QStringList QMimeType::parentMimeTypes() const - static void collectParentMimeTypes(const QString &mime, QStringList &allParents) - { - const QStringList parents = QMimeDatabasePrivate::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); - } - -diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/circular-inheritance.xml b/tests/auto/corelib/mimetypes/qmimedatabase/circular-inheritance.xml -new file mode 100644 -index 0000000000..466f039803 ---- /dev/null -+++ b/tests/auto/corelib/mimetypes/qmimedatabase/circular-inheritance.xml -@@ -0,0 +1,13 @@ -+ -+ -+ -+ It's more accurate to say that ECMAScript is a subset of JavaScript -+ -+ -+ -+ -+ than to say that JavaScript is a subset of ECMAScript -+ -+ -+ -+ -diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/CMakeLists.txt b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/CMakeLists.txt -index 9a70666b07..a267640a50 100644 ---- a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/CMakeLists.txt -+++ b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/CMakeLists.txt -@@ -31,5 +31,6 @@ qt_internal_add_test(tst_qmimedatabase-cache - #) - set(testdata_resource_files -+ "../circular-inheritance.xml" - "../invalid-magic1.xml" - "../invalid-magic2.xml" - "../invalid-magic3.xml" -diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/CMakeLists.txt b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/CMakeLists.txt -index 205d3c362b..729ac3933a 100644 ---- a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/CMakeLists.txt -+++ b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/CMakeLists.txt -@@ -31,5 +31,6 @@ qt_internal_add_test(tst_qmimedatabase-xml - #) - set(testdata_resource_files -+ "../circular-inheritance.xml" - "../invalid-magic1.xml" - "../invalid-magic2.xml" - "../invalid-magic3.xml" -diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp b/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp -index 9bc3037c99..d7db4bb9bf 100644 ---- a/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp -+++ b/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp -@@ -38,6 +38,7 @@ - "invalid-magic2.xml", - "invalid-magic3.xml", - "magic-and-hierarchy.xml", -+ "circular-inheritance.xml", - 0 }; - - static const auto s_resourcePrefix = ":/qt-project.org/qmime/"_L1; -@@ -388,6 +389,13 @@ void tst_QMimeDatabase::inheritance() - const QMimeType mswordTemplate = db.mimeTypeForName(QString::fromLatin1("application/msword-template")); - QVERIFY(mswordTemplate.isValid()); - QVERIFY(mswordTemplate.inherits(QLatin1String("application/msword"))); -+ -+ // Check that buggy type definitions that have circular inheritance don't cause an infinite -+ // loop, especially when resolving a conflict between the file's name and its contents -+ const QMimeType ecmascript = db.mimeTypeForName(QString::fromLatin1("application/ecmascript")); -+ QVERIFY(ecmascript.allAncestors().contains("text/plain")); -+ const QMimeType javascript = db.mimeTypeForFileNameAndData("xml.js", ""); -+ QVERIFY(javascript.inherits(QString::fromLatin1("text/javascript"))); - } - - void tst_QMimeDatabase::aliases() --- -cgit v1.2.3 - diff --git a/0002-HPack-fix-incorrect-integer-overflow-check.patch b/0002-HPack-fix-incorrect-integer-overflow-check.patch deleted file mode 100644 index 9653c35..0000000 --- a/0002-HPack-fix-incorrect-integer-overflow-check.patch +++ /dev/null @@ -1,44 +0,0 @@ -From ee5da1f2eaf8932aeca02ffea6e4c618585e29e3 Mon Sep 17 00:00:00 2001 -From: Marc Mutz -Date: Tue, 12 Dec 2023 22:08:07 +0100 -Subject: [PATCH] HPack: fix incorrect integer overflow check - -This code never worked: - -For the comparison with max() - 32 to trigger, on 32-bit platforms (or -Qt 5) signed interger overflow would have had to happen in the -addition of the two sizes. The compiler can therefore remove the -overflow check as dead code. - -On Qt 6 and 64-bit platforms, the signed integer addition would be -very unlikely to overflow, but the following truncation to uint32 -would yield the correct result only in a narrow 32-value window just -below UINT_MAX, if even that. - -Fix by using the proper tool, qAddOverflow. - -Pick-to: 6.7 6.6 6.5 6.2 5.15 -Change-Id: I7599f2e75ff7f488077b0c60b81022591005661c -Reviewed-by: Allan Sandfeld Jensen ---- - src/network/access/http2/hpacktable.cpp | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/src/network/access/http2/hpacktable.cpp b/src/network/access/http2/hpacktable.cpp -index c8c5d098c80a..2c728b37e3b5 100644 ---- a/src/network/access/http2/hpacktable.cpp -+++ b/src/network/access/http2/hpacktable.cpp -@@ -26,7 +26,9 @@ HeaderSize entry_size(QByteArrayView name, QByteArrayView value) - // for counting the number of references to the name and value would have - // 32 octets of overhead." - -- const unsigned sum = unsigned(name.size() + value.size()); -+ size_t sum; -+ if (qAddOverflow(size_t(name.size()), size_t(value.size()), &sum)) -+ return HeaderSize(); - if (sum > (std::numeric_limits::max() - 32)) - return HeaderSize(); - return HeaderSize(true, quint32(sum + 32)); --- -2.16.3 - diff --git a/qt6-base.changes b/qt6-base.changes index 31439b1..f05627b 100644 --- a/qt6-base.changes +++ b/qt6-base.changes @@ -1,3 +1,15 @@ +------------------------------------------------------------------- +Wed Feb 14 16:53:08 UTC 2024 - Christophe Marin + +- Update to 6.6.2 + * https://www.qt.io/blog/qt-6.6.2-released +- Drop patches, merged upstream: + * 0001-QMimeDatabase-handle-buggy-type-definitions.patch + * 0001-QMimeDatabase-collect-glob-patterns-from.patch + * 0001-HPack-fix-a-Yoda-Condition.patch + * 0002-HPack-fix-incorrect-integer-overflow-check.patch + * 0001-Http2-fix-potential-overflow-in-assemble_hpack_block.patch + ------------------------------------------------------------------- Wed Jan 31 14:51:31 UTC 2024 - Christophe Marin diff --git a/qt6-base.spec b/qt6-base.spec index 84e99ea..b1788c5 100644 --- a/qt6-base.spec +++ b/qt6-base.spec @@ -16,7 +16,7 @@ # -%define real_version 6.6.1 +%define real_version 6.6.2 %define short_version 6.6 %define tar_name qtbase-everywhere-src %define tar_suffix %{nil} @@ -30,7 +30,7 @@ %global with_gles 1 %endif Name: qt6-base%{?pkg_suffix} -Version: 6.6.1 +Version: 6.6.2 Release: 0 Summary: Qt 6 core components (Core, Gui, Widgets, Network...) # Legal: qtpaths is BSD-3-Clause @@ -39,11 +39,6 @@ URL: https://www.qt.io Source: https://download.qt.io/official_releases/qt/%{short_version}/%{real_version}%{tar_suffix}/submodules/%{tar_name}-%{real_version}%{tar_suffix}.tar.xz Source99: qt6-base-rpmlintrc # Patches 0-100 are upstream patches # -Patch0: 0001-QMimeDatabase-handle-buggy-type-definitions.patch -Patch1: 0001-QMimeDatabase-collect-glob-patterns-from.patch -Patch2: 0001-HPack-fix-a-Yoda-Condition.patch -Patch3: 0002-HPack-fix-incorrect-integer-overflow-check.patch -Patch4: 0001-Http2-fix-potential-overflow-in-assemble_hpack_block.patch # Patches 100-200 are openSUSE and/or non-upstream(able) patches # Patch100: 0001-Tell-the-truth-about-private-API.patch # No need to pollute the library dir with object files, install them in the qt6 subfolder diff --git a/qtbase-everywhere-src-6.6.1.tar.xz b/qtbase-everywhere-src-6.6.1.tar.xz deleted file mode 100644 index ce55da5..0000000 --- a/qtbase-everywhere-src-6.6.1.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:450c5b4677b2fe40ed07954d7f0f40690068e80a94c9df86c2c905ccd59d02f7 -size 48370760 diff --git a/qtbase-everywhere-src-6.6.2.tar.xz b/qtbase-everywhere-src-6.6.2.tar.xz new file mode 100644 index 0000000..aced54d --- /dev/null +++ b/qtbase-everywhere-src-6.6.2.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b89b426b9852a17d3e96230ab0871346574d635c7914480a2a27f98ff942677b +size 48689304