From d9d16dc8e0ea60a11fb75c8ccfc8904848d2d1fa Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Tue, 25 Oct 2016 01:45:41 +0100 Subject: [PATCH] refs #782 Check permissions in CAtomicFile::open to get earlier indication of any problems. --- src/blackmisc/atomicfile.cpp | 27 +++++++++++++++++++++++++++ src/blackmisc/atomicfile.h | 1 + 2 files changed, 28 insertions(+) diff --git a/src/blackmisc/atomicfile.cpp b/src/blackmisc/atomicfile.cpp index 9cc337fab..73d86d89e 100644 --- a/src/blackmisc/atomicfile.cpp +++ b/src/blackmisc/atomicfile.cpp @@ -23,13 +23,38 @@ #include #endif +//! \var qt_ntfs_permission_lookup +//! \see QFileDevice::Permissions +#ifdef Q_OS_WIN +extern Q_CORE_EXPORT int qt_ntfs_permission_lookup; +#else +int qt_ntfs_permission_lookup = 0; +#endif + namespace BlackMisc { + //! \private + bool checkPermissions(CAtomicFile::OpenMode mode, const QFileInfo &fileInfo) + { + bool ok = true; + qt_ntfs_permission_lookup++; + if ((mode & CAtomicFile::ReadOnly) && ! fileInfo.isReadable()) { ok = false; } + if ((mode & CAtomicFile::WriteOnly) && ! fileInfo.isWritable()) { ok = false; } + qt_ntfs_permission_lookup--; + return ok; + } + bool CAtomicFile::open(CAtomicFile::OpenMode mode) { m_originalFilename = fileName(); QFileInfo fileInfo(fileName()); + if (exists() && ! checkPermissions(mode, fileInfo)) + { + m_permissionError = true; + setErrorString("Wrong permissions"); + return false; + } setFileName(QFileInfo(fileInfo.dir(), ".tmp." + fileInfo.fileName() + "." + randomSuffix()).filePath()); if (exists()) { remove(); } @@ -72,12 +97,14 @@ namespace BlackMisc CAtomicFile::FileError CAtomicFile::error() const { if (m_renameError) { return RenameError; } + if (m_permissionError) { return PermissionsError; } return QFile::error(); } void CAtomicFile::unsetError() { m_renameError = false; + m_permissionError = false; QFile::unsetError(); } diff --git a/src/blackmisc/atomicfile.h b/src/blackmisc/atomicfile.h index f9771f9cb..126cbd86e 100644 --- a/src/blackmisc/atomicfile.h +++ b/src/blackmisc/atomicfile.h @@ -63,6 +63,7 @@ namespace BlackMisc QString m_originalFilename; bool m_renameError = false; + bool m_permissionError = false; }; }