diff options
author | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-05-27 15:51:21 +0200 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-05-27 16:07:11 +0200 |
commit | bd766f927bd6501a4c4c9fb0aee2c7a813cf721c (patch) | |
tree | 476123c37748059b830cfd76e92c2eebb36ddee4 | |
parent | ce77ec7f02e72818c012a24f2731adb6efdff515 (diff) |
fix relative paths with .. in wildcards
The absolute file paths that are returned by wildcards must not contain
substrings like "..". Running those through QDir::cleanPath now.
Autotest TestLanguage::wildcards enhanced.
Task-number: QBS-287
Change-Id: Id6882d9d6eaa875bed42ac1830afef43a705b4da
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
-rw-r--r-- | src/lib/language/language.cpp | 2 | ||||
-rw-r--r-- | src/lib/language/tst_language.cpp | 31 |
2 files changed, 31 insertions, 2 deletions
diff --git a/src/lib/language/language.cpp b/src/lib/language/language.cpp index 1fe2ababb..35fbf9296 100644 --- a/src/lib/language/language.cpp +++ b/src/lib/language/language.cpp @@ -778,7 +778,7 @@ void SourceWildCards::expandPatterns(QSet<QString> &result, const GroupConstPtr if (isDir) expandPatterns(result, group, changed_parts, filePath); else - result += filePath; + result += QDir::cleanPath(filePath); } } diff --git a/src/lib/language/tst_language.cpp b/src/lib/language/tst_language.cpp index ec825f86a..f4d4f9ad9 100644 --- a/src/lib/language/tst_language.cpp +++ b/src/lib/language/tst_language.cpp @@ -948,6 +948,7 @@ void TestLanguage::wildcards_data() { QTest::addColumn<bool>("useGroup"); QTest::addColumn<QStringList>("filesToCreate"); + QTest::addColumn<QString>("projectFileSubDir"); QTest::addColumn<QString>("prefix"); QTest::addColumn<QStringList>("patterns"); QTest::addColumn<QStringList>("excludePatterns"); @@ -961,6 +962,7 @@ void TestLanguage::wildcards_data() << useGroup << (QStringList() << "foo.h" << "foo.cpp" << "bar.h" << "bar.cpp") << QString() + << QString() << (QStringList() << "*.h") << QStringList() << (QStringList() << "foo.h" << "bar.h"); @@ -968,6 +970,7 @@ void TestLanguage::wildcards_data() << useGroup << (QStringList() << "foo.h" << "foo.cpp" << "bar.h" << "bar.cpp") << QString() + << QString() << (QStringList() << "foo.*") << QStringList() << (QStringList() << "foo.h" << "foo.cpp"); @@ -975,6 +978,7 @@ void TestLanguage::wildcards_data() << useGroup << (QStringList() << "foo.h" << "foo.cpp" << "bar.h" << "bar.cpp") << QString() + << QString() << (QStringList() << "*.h" << "*.cpp") << QStringList() << (QStringList() << "foo.h" << "foo.cpp" << "bar.h" << "bar.cpp"); @@ -982,6 +986,7 @@ void TestLanguage::wildcards_data() << useGroup << (QStringList() << "foo.h" << "foo.cpp" << "bar.h" << "bar.cpp") << QString() + << QString() << (QStringList() << "*.h" << "*.cpp") << (QStringList() << "bar*") << (QStringList() << "foo.h" << "foo.cpp"); @@ -989,6 +994,7 @@ void TestLanguage::wildcards_data() << useGroup << (QStringList() << "foo.h" << "foo.cpp" << "bar.h" << "bar.cpp") << QString() + << QString() << (QStringList() << "*") << (QStringList() << "*.qbs") << (QStringList() << "foo.h" << "foo.cpp" << "bar.h" << "bar.cpp"); @@ -996,6 +1002,7 @@ void TestLanguage::wildcards_data() << useGroup << (QStringList() << "a/foo.h" << "a/foo.cpp" << "a/b/bar.h" << "a/b/bar.cpp") << QString() + << QString() << (QStringList() << "a/*") << QStringList() << (QStringList() << "a/foo.h" << "a/foo.cpp"); @@ -1003,14 +1010,24 @@ void TestLanguage::wildcards_data() << useGroup << (QStringList() << "foo.h" << "foo.cpp" << "bar.h" << "bar.cpp") << QString() + << QString() << (QStringList() << m_wildcardsTestDirPath + "/?oo.*") << QStringList() << (QStringList() << "foo.h" << "foo.cpp"); + QTest::newRow(QByteArray("relative paths with dotdot") + dataTagSuffix) + << useGroup + << (QStringList() << "bar.h" << "bar.cpp") + << QString("TheLaughingLlama") + << QString() + << (QStringList() << "../bar.*") + << QStringList() + << (QStringList() << "bar.h" << "bar.cpp"); } QTest::newRow(QByteArray("recursive 1")) << useGroup << (QStringList() << "a/foo.h" << "a/foo.cpp" << "a/b/bar.h" << "a/b/bar.cpp") << QString() + << QString() << (QStringList() << "a/**") << QStringList() << (QStringList() << "a/foo.h" << "a/foo.cpp" << "a/b/bar.h" << "a/b/bar.cpp"); @@ -1024,6 +1041,7 @@ void TestLanguage::wildcards_data() << "a/d/1.cpp" << "a/b/d/1.cpp" << "a/b/c/d/1.h" << "a/d/e/1.cpp" << "a/b/d/e/1.cpp" << "a/b/c/d/e/1.cpp") << QString() + << QString() << (QStringList() << "a/**/d/*.h") << QStringList() << (QStringList() << "a/d/1.h" << "a/b/d/1.h" << "a/b/c/d/1.h"); @@ -1031,6 +1049,7 @@ void TestLanguage::wildcards_data() << useGroup << (QStringList() << "a/foo.h" << "a/foo.cpp" << "a/b/bar.h" << "a/b/bar.cpp") << QString() + << QString() << (QStringList() << "a/**/**/**") << QStringList() << (QStringList() << "a/foo.h" << "a/foo.cpp" << "a/b/bar.h" << "a/b/bar.cpp"); @@ -1038,6 +1057,7 @@ void TestLanguage::wildcards_data() << useGroup << (QStringList() << "subdir/foo.h" << "subdir/foo.cpp" << "subdir/bar.h" << "subdir/bar.cpp") + << QString() << QString("subdir/") << (QStringList() << "*.h") << QStringList() @@ -1048,6 +1068,7 @@ void TestLanguage::wildcards() { QFETCH(bool, useGroup); QFETCH(QStringList, filesToCreate); + QFETCH(QString, projectFileSubDir); QFETCH(QString, prefix); QFETCH(QStringList, patterns); QFETCH(QStringList, excludePatterns); @@ -1070,7 +1091,15 @@ void TestLanguage::wildcards() const QString groupName = "Keks"; QString dataTag = QString::fromLocal8Bit(QTest::currentDataTag()); dataTag.replace(' ', '_'); - const QString projectFilePath = m_wildcardsTestDirPath + "/test_" + dataTag + ".qbs"; + if (!projectFileSubDir.isEmpty()) { + if (!projectFileSubDir.startsWith('/')) + projectFileSubDir.prepend('/'); + if (projectFileSubDir.endsWith('/')) + projectFileSubDir.chop(1); + QVERIFY(QDir().mkpath(m_wildcardsTestDirPath + projectFileSubDir)); + } + const QString projectFilePath = m_wildcardsTestDirPath + projectFileSubDir + "/test_" + dataTag + + ".qbs"; { QFile projectFile(projectFilePath); QVERIFY(projectFile.open(QIODevice::WriteOnly)); |