From 523440a15f83dfda30e6bede02f83d76d8765647 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Thu, 29 May 2014 00:39:02 +0200 Subject: QSaveFile: error out in open when the file is a directory Change-Id: Ifb1697fedf6dd28fe317282c8b4824f34ec61981 Reviewed-by: David Faure --- src/corelib/io/qsavefile.cpp | 6 ++++++ tests/auto/corelib/io/qsavefile/tst_qsavefile.cpp | 25 +++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/corelib/io/qsavefile.cpp b/src/corelib/io/qsavefile.cpp index 05d7687007..8be4125ef5 100644 --- a/src/corelib/io/qsavefile.cpp +++ b/src/corelib/io/qsavefile.cpp @@ -206,6 +206,12 @@ bool QSaveFile::open(OpenMode mode) return false; } + if (existingFile.isDir()) { + d->setError(QFileDevice::WriteError, QSaveFile::tr("Filename refers to a directory")); + d->writeError = QFileDevice::WriteError; + return false; + } + // Resolve symlinks. Don't use QFileInfo::canonicalFilePath so it still give the expected // target even if the file does not exist d->finalFileName = d->fileName; diff --git a/tests/auto/corelib/io/qsavefile/tst_qsavefile.cpp b/tests/auto/corelib/io/qsavefile/tst_qsavefile.cpp index 63b9266ff6..08b943ba72 100644 --- a/tests/auto/corelib/io/qsavefile/tst_qsavefile.cpp +++ b/tests/auto/corelib/io/qsavefile/tst_qsavefile.cpp @@ -94,6 +94,7 @@ private slots: void transactionalWriteCanceled(); void transactionalWriteErrorRenaming(); void symlink(); + void directory(); }; static inline QByteArray msgCannotOpen(const QFileDevice &f) @@ -454,5 +455,29 @@ void tst_QSaveFile::symlink() #endif } +void tst_QSaveFile::directory() +{ + QTemporaryDir dir; + QVERIFY(dir.isValid()); + + const QString subdir = dir.path() + QLatin1String("/subdir"); + QVERIFY(QDir(dir.path()).mkdir(QStringLiteral("subdir"))); + { + QFile sf(subdir); + QVERIFY(!sf.open(QIODevice::WriteOnly)); + } + +#ifdef Q_OS_UNIX + //link to a directory + const QString linkToDir = dir.path() + QLatin1String("/linkToDir"); + QVERIFY(QFile::link(subdir, linkToDir)); + + { + QFile sf(linkToDir); + QVERIFY(!sf.open(QIODevice::WriteOnly)); + } +#endif +} + QTEST_MAIN(tst_QSaveFile) #include "tst_qsavefile.moc" -- cgit v1.2.3