diff --git a/src/libs/utils/savefile.cpp b/src/libs/utils/savefile.cpp index bd6278a587e..55ba2925fb5 100644 --- a/src/libs/utils/savefile.cpp +++ b/src/libs/utils/savefile.cpp @@ -34,10 +34,13 @@ # include #else # include +# include #endif namespace Utils { +QFile::Permissions SaveFile::m_umask = 0; + SaveFile::SaveFile(const QString &filename) : m_finalFileName(filename), m_finalized(true), m_backup(false) { @@ -65,8 +68,19 @@ bool SaveFile::open(OpenMode flags) return false; m_finalized = false; // needs clean up in the end - if (ofi.exists()) + if (ofi.exists()) { setPermissions(ofi.permissions()); // Ignore errors + } else { + Permissions permAll = QFile::ReadOwner + | QFile::ReadGroup + | QFile::ReadOther + | QFile::WriteOwner + | QFile::WriteGroup + | QFile::WriteOther; + + // set permissions with respect to the current umask + setPermissions(permAll & ~m_umask); + } return true; } @@ -114,4 +128,27 @@ bool SaveFile::commit() return true; } +void SaveFile::initializeUmask() +{ +#ifdef Q_OS_WIN + m_umask = QFile::WriteGroup | QFile::WriteOther; +#else + // Get the current process' file creation mask (umask) + // umask() is not thread safe so this has to be done by single threaded + // application initialization + mode_t mask = umask(0); // get current umask + umask(mask); // set it back + + m_umask = ((mask & S_IRUSR) ? QFile::ReadOwner : QFlags(0)) + | ((mask & S_IWUSR) ? QFile::WriteOwner : QFlags(0)) + | ((mask & S_IXUSR) ? QFile::ExeOwner : QFlags(0)) + | ((mask & S_IRGRP) ? QFile::ReadGroup : QFlags(0)) + | ((mask & S_IWGRP) ? QFile::WriteGroup : QFlags(0)) + | ((mask & S_IXGRP) ? QFile::ExeGroup : QFlags(0)) + | ((mask & S_IROTH) ? QFile::ReadOther : QFlags(0)) + | ((mask & S_IWOTH) ? QFile::WriteOther : QFlags(0)) + | ((mask & S_IXOTH) ? QFile::ExeOther : QFlags(0)); +#endif +} + } // namespace Utils diff --git a/src/libs/utils/savefile.h b/src/libs/utils/savefile.h index 6ba00b27685..19b17839384 100644 --- a/src/libs/utils/savefile.h +++ b/src/libs/utils/savefile.h @@ -49,10 +49,13 @@ public: void setBackup(bool backup) { m_backup = backup; } + static void initializeUmask(); + private: const QString m_finalFileName; bool m_finalized; bool m_backup; + static QFile::Permissions m_umask; }; } // namespace Utils diff --git a/src/plugins/coreplugin/coreplugin.cpp b/src/plugins/coreplugin/coreplugin.cpp index 049b61d0cbc..265d63cc327 100644 --- a/src/plugins/coreplugin/coreplugin.cpp +++ b/src/plugins/coreplugin/coreplugin.cpp @@ -40,6 +40,7 @@ #include "infobar.h" #include +#include #include #include @@ -95,6 +96,10 @@ bool CorePlugin::initialize(const QStringList &arguments, QString *errorMessage) m_designMode = new DesignMode; InfoBar::initializeGloballySuppressed(); } + + // Make sure we respect the process's umask when creating new files + Utils::SaveFile::initializeUmask(); + return success; }