refs #782 Check permissions in CAtomicFile::open to get earlier indication of any problems.

This commit is contained in:
Mathew Sutcliffe
2016-10-25 01:45:41 +01:00
committed by Klaus Basan
parent 49f2d5566c
commit d9d16dc8e0
2 changed files with 28 additions and 0 deletions

View File

@@ -23,13 +23,38 @@
#include <windows.h>
#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();
}

View File

@@ -63,6 +63,7 @@ namespace BlackMisc
QString m_originalFilename;
bool m_renameError = false;
bool m_permissionError = false;
};
}