From 56fa23911c3a0681de39601489d51805e208dc03 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 16 Oct 2024 07:41:23 -0700 Subject: [PATCH] QFactoryLoader: fix the ability to load symlinks to plugins Amends commit 7cf39bd785e8ba817960d48b120983cafcc539f3, which changed to use QDirListing but used FilesOnly. As documented, that does not include symlinks to files. I'm updating a few other uses of FilesOnly where they were ported from QDir::Files and it would be reasonable to expect that symlink to files would be included. That's why I've left QNetworkDiskCache alone. Fixes: QTBUG-130109 Pick-to: 6.8 Change-Id: I1fa195b42fd5e00be157fffd6c861f6ddb1eeed1 Reviewed-by: Ahmad Samir --- qmake/generators/win32/msvc_nmake.cpp | 2 +- qmake/generators/win32/msvc_vcproj.cpp | 2 +- src/corelib/mimetypes/qmimeprovider.cpp | 3 ++- src/corelib/plugin/qfactoryloader.cpp | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/qmake/generators/win32/msvc_nmake.cpp b/qmake/generators/win32/msvc_nmake.cpp index 4e43b4e6bd7..ab7e5e0ab58 100644 --- a/qmake/generators/win32/msvc_nmake.cpp +++ b/qmake/generators/win32/msvc_nmake.cpp @@ -316,7 +316,7 @@ void NmakeMakefileGenerator::writeImplicitRulesPart(QTextStream &t) fixifiedSourceDirs.removeDuplicates(); using F = QDirListing::IteratorFlag; for (const QString &sourceDir : std::as_const(fixifiedSourceDirs)) { - for (const auto &dirEntry : QDirListing(sourceDir, sourceFilesFilter, F::FilesOnly)) { + for (const auto &dirEntry : QDirListing(sourceDir, sourceFilesFilter, F::FilesOnly | F::ResolveSymlinks)) { QString &duplicate = fileNames[dirEntry.completeBaseName()]; if (duplicate.isNull()) { duplicate = dirEntry.filePath(); diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp index 82d47f59811..1566f72ba66 100644 --- a/qmake/generators/win32/msvc_vcproj.cpp +++ b/qmake/generators/win32/msvc_vcproj.cpp @@ -1294,7 +1294,7 @@ void VcprojGenerator::initDeploymentTool() int pathSize = searchPath.size(); using F = QDirListing::IteratorFlag; - QDirListing dirList(searchPath, QStringList{nameFilter}, F::FilesOnly | F::Recursive); + QDirListing dirList(searchPath, QStringList{nameFilter}, F::FilesOnly | F::ResolveSymlinks | F::Recursive); // foreach dirIterator-entry in d for (const auto &dirEntry : dirList) { const QString absoluteItemPath = Option::fixPathToTargetOS(dirEntry.absolutePath()); diff --git a/src/corelib/mimetypes/qmimeprovider.cpp b/src/corelib/mimetypes/qmimeprovider.cpp index d12449c3988..08828c3e386 100644 --- a/src/corelib/mimetypes/qmimeprovider.cpp +++ b/src/corelib/mimetypes/qmimeprovider.cpp @@ -729,7 +729,8 @@ void QMimeXMLProvider::ensureLoaded() { QStringList allFiles; const QString packageDir = m_directory + QStringView(u"/packages"); - for (const auto &entry : QDirListing(packageDir, QDirListing::IteratorFlag::FilesOnly)) + for (const auto &entry : QDirListing(packageDir, QDirListing::IteratorFlag::FilesOnly + | QDirListing::IteratorFlag::ResolveSymlinks)) allFiles.emplace_back(packageDir + u'/' + entry.fileName()); if (m_allFiles == allFiles) diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp index d2405e5c92e..5abd6ff719e 100644 --- a/src/corelib/plugin/qfactoryloader.cpp +++ b/src/corelib/plugin/qfactoryloader.cpp @@ -309,7 +309,7 @@ inline void QFactoryLoaderPrivate::updateSinglePath(const QString &path) #elif defined(Q_OS_ANDROID) QStringList("libplugins_%1_*.so"_L1.arg(suffix)), #endif - QDirListing::IteratorFlag::FilesOnly); + QDirListing::IteratorFlag::FilesOnly | QDirListing::IteratorFlag::ResolveSymlinks); for (const auto &dirEntry : plugins) { const QString &fileName = dirEntry.fileName();