diff options
author | Shane Kearns <ext-shane.2.kearns@nokia.com> | 2012-05-02 16:46:52 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-05-16 04:24:43 +0200 |
commit | 2380765a2b4563bc714f947927d2cd48e2bbb49d (patch) | |
tree | 5ed976f6ada291ea9cfe4f0af4ddfa1413d99120 | |
parent | 3e697188dab7e14e4e1e2796f89962bf6ccab76d (diff) |
Fix QFile::permissions for long filenames
When qt_ntfs_permission_lookup is used, QFile::permissions failed
for files with long filenames.
Also created a test case for this API, which revealed another bug.
Task-number: QTBUG-25629
Change-Id: I73b7676a9d059c0e782b3f701b2e6bbc92f671ed
Reviewed-by: Prasanth Ullattil <prasanth.ullattil@nokia.com>
-rw-r--r-- | src/corelib/io/qfilesystemengine_win.cpp | 2 | ||||
-rw-r--r-- | tests/auto/corelib/io/qfile/tst_qfile.cpp | 66 |
2 files changed, 60 insertions, 8 deletions
diff --git a/src/corelib/io/qfilesystemengine_win.cpp b/src/corelib/io/qfilesystemengine_win.cpp index 3e7e34d90b..e7a949a77a 100644 --- a/src/corelib/io/qfilesystemengine_win.cpp +++ b/src/corelib/io/qfilesystemengine_win.cpp @@ -623,7 +623,7 @@ bool QFileSystemEngine::fillPermissions(const QFileSystemEntry &entry, QFileSyst if(ptrGetNamedSecurityInfoW && ptrBuildTrusteeWithSidW && ptrGetEffectiveRightsFromAclW) { enum { ReadMask = 0x00000001, WriteMask = 0x00000002, ExecMask = 0x00000020 }; - QString fname = entry.filePath(); + QString fname = entry.nativeFilePath(); PSID pOwner = 0; PSID pGroup = 0; PACL pDacl; diff --git a/tests/auto/corelib/io/qfile/tst_qfile.cpp b/tests/auto/corelib/io/qfile/tst_qfile.cpp index db0ec39106..f310b2005a 100644 --- a/tests/auto/corelib/io/qfile/tst_qfile.cpp +++ b/tests/auto/corelib/io/qfile/tst_qfile.cpp @@ -51,6 +51,12 @@ #include <private/qabstractfileengine_p.h> #include <private/qfsfileengine_p.h> +#ifdef Q_OS_WIN +QT_BEGIN_NAMESPACE +extern Q_CORE_EXPORT int qt_ntfs_permission_lookup; +QT_END_NAMESPACE +#endif + #if !defined(Q_OS_WINCE) #include <QHostInfo> #endif @@ -137,6 +143,8 @@ private slots: void append(); void permissions_data(); void permissions(); + void permissionsNtfs_data(); + void permissionsNtfs(); void setPermissions(); void copy(); void copyAfterFail(); @@ -1091,12 +1099,21 @@ void tst_QFile::permissions_data() QTest::addColumn<QString>("file"); QTest::addColumn<uint>("perms"); QTest::addColumn<bool>("expected"); + QTest::addColumn<bool>("create"); - QTest::newRow("data0") << QCoreApplication::instance()->applicationFilePath() << uint(QFile::ExeUser) << true; - QTest::newRow("data1") << QFINDTESTDATA("tst_qfile.cpp") << uint(QFile::ReadUser) << true; - QTest::newRow("resource1") << ":/tst_qfileinfo/resources/file1.ext1" << uint(QFile::ReadUser) << true; - QTest::newRow("resource2") << ":/tst_qfileinfo/resources/file1.ext1" << uint(QFile::WriteUser) << false; - QTest::newRow("resource3") << ":/tst_qfileinfo/resources/file1.ext1" << uint(QFile::ExeUser) << false; + QTest::newRow("data0") << QCoreApplication::instance()->applicationFilePath() << uint(QFile::ExeUser) << true << false; + QTest::newRow("data1") << QFINDTESTDATA("tst_qfile.cpp") << uint(QFile::ReadUser) << true << false; + QTest::newRow("readonly") << QFINDTESTDATA("readonlyfile") << uint(QFile::WriteUser) << false << false; +#ifndef Q_OS_WINCE + QTest::newRow("longfile") << QString::fromLatin1("longFileNamelongFileNamelongFileNamelongFileName" + "longFileNamelongFileNamelongFileNamelongFileName" + "longFileNamelongFileNamelongFileNamelongFileName" + "longFileNamelongFileNamelongFileNamelongFileName" + "longFileNamelongFileNamelongFileNamelongFileName.txt") << uint(QFile::ReadUser) << true << true; +#endif + QTest::newRow("resource1") << ":/tst_qfileinfo/resources/file1.ext1" << uint(QFile::ReadUser) << true << false; + QTest::newRow("resource2") << ":/tst_qfileinfo/resources/file1.ext1" << uint(QFile::WriteUser) << false << false; + QTest::newRow("resource3") << ":/tst_qfileinfo/resources/file1.ext1" << uint(QFile::ExeUser) << false << false; } void tst_QFile::permissions() @@ -1104,9 +1121,44 @@ void tst_QFile::permissions() QFETCH(QString, file); QFETCH(uint, perms); QFETCH(bool, expected); + QFETCH(bool, create); + if (create) { + QFile fc(file); + QVERIFY(fc.open(QFile::WriteOnly)); + QVERIFY(fc.write("hello\n")); + fc.close(); + } + QFile f(file); - QCOMPARE(((f.permissions() & perms) == QFile::Permissions(perms)), expected); - QCOMPARE(((QFile::permissions(file) & perms) == QFile::Permissions(perms)), expected); + QFile::Permissions memberResult = f.permissions() & perms; + QFile::Permissions staticResult = QFile::permissions(file) & perms; + + if (create) { + QFile::remove(file); + } + +#ifdef Q_OS_WIN + if (qt_ntfs_permission_lookup) + QEXPECT_FAIL("readonly", "QTBUG-25630", Abort); +#endif + QCOMPARE((memberResult == QFile::Permissions(perms)), expected); + QCOMPARE((staticResult == QFile::Permissions(perms)), expected); +} + +void tst_QFile::permissionsNtfs_data() +{ + permissions_data(); +} + +void tst_QFile::permissionsNtfs() +{ +#ifdef Q_OS_WIN + QScopedValueRollback<int> ntfsMode(qt_ntfs_permission_lookup); + qt_ntfs_permission_lookup++; + permissions(); +#else + QSKIP("windows test"); +#endif } void tst_QFile::setPermissions() |