diff options
author | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2018-08-25 17:33:24 +0200 |
---|---|---|
committer | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2018-08-25 21:12:30 +0200 |
commit | 8c87131904de7e2f89829e4269c92562a0f8f75f (patch) | |
tree | 3f0022c9498a4dd2d62eaf626477b61bb39c7581 | |
parent | b4dc9e69e7c553dd6c1ddb567320a2ce51e8be23 (diff) |
Avoid crashes caused by dynamic initialization.
-rw-r--r-- | src/qtpasssettings.cpp | 20 | ||||
-rw-r--r-- | src/qtpasssettings.h | 4 |
2 files changed, 14 insertions, 10 deletions
diff --git a/src/qtpasssettings.cpp b/src/qtpasssettings.cpp index 14b0c250..3a544a8e 100644 --- a/src/qtpasssettings.cpp +++ b/src/qtpasssettings.cpp @@ -8,8 +8,12 @@ bool QtPassSettings::initialized = false; Pass *QtPassSettings::pass; -RealPass QtPassSettings::realPass; -ImitatePass QtPassSettings::imitatePass; +// Go via pointer to avoid dynamic initialization, +// due to "random" initialization order realtive to other +// globals, especially around QObject emtadata dynamic initialization +// can lead to crashes depending on compiler, linker etc. +QScopedPointer<RealPass> QtPassSettings::realPass; +QScopedPointer<ImitatePass> QtPassSettings::imitatePass; QtPassSettings *QtPassSettings::m_instance = nullptr; QtPassSettings *QtPassSettings::getInstance() { @@ -83,9 +87,9 @@ void QtPassSettings::setProfiles(const QHash<QString, QString> &profiles) { Pass *QtPassSettings::getPass() { if (!pass) { if (isUsePass()) { - QtPassSettings::pass = &QtPassSettings::realPass; + QtPassSettings::pass = getRealPass(); } else { - QtPassSettings::pass = &QtPassSettings::imitatePass; + QtPassSettings::pass = getImitatePass(); } pass->init(); } @@ -149,9 +153,9 @@ bool QtPassSettings::isUsePass(const bool &defaultValue) { } void QtPassSettings::setUsePass(const bool &usePass) { if (usePass) { - QtPassSettings::pass = &QtPassSettings::realPass; + QtPassSettings::pass = getRealPass(); } else { - QtPassSettings::pass = &QtPassSettings::imitatePass; + QtPassSettings::pass = getImitatePass(); } getInstance()->setValue(SettingsConstants::usePass, usePass); } @@ -527,5 +531,5 @@ void QtPassSettings::setTemplateAllFields(const bool &templateAllFields) { templateAllFields); } -RealPass *QtPassSettings::getRealPass() { return &realPass; } -ImitatePass *QtPassSettings::getImitatePass() { return &imitatePass; } +RealPass *QtPassSettings::getRealPass() { if (realPass.isNull()) realPass.reset(new RealPass()); return realPass.data(); } +ImitatePass *QtPassSettings::getImitatePass() { if (imitatePass.isNull()) imitatePass.reset(new ImitatePass()); return imitatePass.data(); } diff --git a/src/qtpasssettings.h b/src/qtpasssettings.h index 5d787277..aad36da6 100644 --- a/src/qtpasssettings.h +++ b/src/qtpasssettings.h @@ -33,8 +33,8 @@ private: static QtPassSettings *m_instance; static Pass *pass; - static RealPass realPass; - static ImitatePass imitatePass; + static QScopedPointer<RealPass> realPass; + static QScopedPointer<ImitatePass> imitatePass; public: static QtPassSettings *getInstance(); |