QStandardPaths: fix empty path in XDG_DATA_DIRS being treated as '/'.
The basedir xdg spec says: "All paths set in these environment variables must be absolute. If an implementation encounters a relative path in any of these variables it should consider the path invalid and ignore it." Therefore we ignore relative paths including the empty string. Change-Id: I8f779b78981018051b16de23b2514f2e62b7ab39 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
4965cf78c1
commit
5c9d671bfb
@ -259,10 +259,17 @@ static QStringList xdgDataDirs()
|
|||||||
dirs.append(QString::fromLatin1("/usr/local/share"));
|
dirs.append(QString::fromLatin1("/usr/local/share"));
|
||||||
dirs.append(QString::fromLatin1("/usr/share"));
|
dirs.append(QString::fromLatin1("/usr/share"));
|
||||||
} else {
|
} else {
|
||||||
dirs = xdgDataDirsEnv.split(QLatin1Char(':'));
|
dirs = xdgDataDirsEnv.split(QLatin1Char(':'), QString::SkipEmptyParts);
|
||||||
// Normalize paths
|
|
||||||
for (int i = 0; i < dirs.count(); i++)
|
// Normalize paths, skip relative paths
|
||||||
dirs[i] = QDir::cleanPath(dirs.at(i));
|
QMutableListIterator<QString> it(dirs);
|
||||||
|
while (it.hasNext()) {
|
||||||
|
const QString dir = it.next();
|
||||||
|
if (!dir.startsWith(QLatin1Char('/')))
|
||||||
|
it.remove();
|
||||||
|
else
|
||||||
|
it.setValue(QDir::cleanPath(dir));
|
||||||
|
}
|
||||||
|
|
||||||
// Remove duplicates from the list, there's no use for duplicated
|
// Remove duplicates from the list, there's no use for duplicated
|
||||||
// paths in XDG_DATA_DIRS - if it's not found in the given
|
// paths in XDG_DATA_DIRS - if it's not found in the given
|
||||||
|
@ -77,6 +77,7 @@ private slots:
|
|||||||
void testAllWritableLocations_data();
|
void testAllWritableLocations_data();
|
||||||
void testAllWritableLocations();
|
void testAllWritableLocations();
|
||||||
void testCleanPath();
|
void testCleanPath();
|
||||||
|
void testXdgPathCleanup();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
#ifdef Q_XDG_PLATFORM
|
#ifdef Q_XDG_PLATFORM
|
||||||
@ -491,6 +492,19 @@ void tst_qstandardpaths::testCleanPath()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_qstandardpaths::testXdgPathCleanup()
|
||||||
|
{
|
||||||
|
#ifdef Q_XDG_PLATFORM
|
||||||
|
setCustomLocations();
|
||||||
|
const QString uncleanGlobalAppDir = "/./" + QFile::encodeName(m_globalAppDir);
|
||||||
|
qputenv("XDG_DATA_DIRS", QFile::encodeName(uncleanGlobalAppDir) + "::relative/path");
|
||||||
|
const QStringList appsDirs = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
|
||||||
|
QVERIFY(!appsDirs.contains("/applications"));
|
||||||
|
QVERIFY(!appsDirs.contains(uncleanGlobalAppDir + "/applications"));
|
||||||
|
QVERIFY(!appsDirs.contains("relative/path/applications"));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
QTEST_MAIN(tst_qstandardpaths)
|
QTEST_MAIN(tst_qstandardpaths)
|
||||||
|
|
||||||
#include "tst_qstandardpaths.moc"
|
#include "tst_qstandardpaths.moc"
|
||||||
|
Loading…
Reference in New Issue
Block a user