diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp index d3a6e3c238..c2f421843c 100644 --- a/src/corelib/io/qtemporaryfile.cpp +++ b/src/corelib/io/qtemporaryfile.cpp @@ -160,7 +160,14 @@ static bool createFileFromTemplate(NativeFileHandle &file, return true; DWORD err = GetLastError(); - if (err != ERROR_FILE_EXISTS) { + if (err == ERROR_ACCESS_DENIED) { + DWORD attributes = GetFileAttributes((const wchar_t *)path.constData()); + if (attributes == INVALID_FILE_ATTRIBUTES) { + // Potential write error (read-only parent directory, etc.). + error = QSystemError(err, QSystemError::NativeError); + return false; + } // else file already exists as a directory. + } else if (err != ERROR_FILE_EXISTS) { error = QSystemError(err, QSystemError::NativeError); return false; } diff --git a/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp b/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp index 28cf7a904a..6eb6f83d2a 100644 --- a/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp +++ b/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp @@ -92,6 +92,7 @@ private slots: void createNativeFile(); void QTBUG_4796_data(); void QTBUG_4796(); + void guaranteeUnique(); }; void tst_QTemporaryFile::initTestCase() @@ -782,5 +783,39 @@ void tst_QTemporaryFile::QTBUG_4796() cleaner.reset(); } +void tst_QTemporaryFile::guaranteeUnique() +{ + QDir dir(QDir::tempPath()); + QString takenFileName; + + // First pass. See which filename QTemporaryFile will try first. + { + // Fix the random seed. + qsrand(1135); + QTemporaryFile tmpFile("testFile1.XXXXXX"); + tmpFile.open(); + takenFileName = tmpFile.fileName(); + QVERIFY(QFile::exists(takenFileName)); + } + + QVERIFY(!QFile::exists(takenFileName)); + + // Create a directory with same name. + QVERIFY(dir.mkdir(takenFileName)); + + // Second pass, now we have blocked its first attempt with a directory. + { + // Fix the random seed. + qsrand(1135); + QTemporaryFile tmpFile("testFile1.XXXXXX"); + QVERIFY(tmpFile.open()); + QString uniqueFileName = tmpFile.fileName(); + QVERIFY(QFileInfo(uniqueFileName).isFile()); + QVERIFY(uniqueFileName != takenFileName); + } + + QVERIFY(dir.rmdir(takenFileName)); +} + QTEST_MAIN(tst_QTemporaryFile) #include "tst_qtemporaryfile.moc"