summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>2018-08-25 17:33:24 +0200
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>2018-08-25 21:12:30 +0200
commit8c87131904de7e2f89829e4269c92562a0f8f75f (patch)
tree3f0022c9498a4dd2d62eaf626477b61bb39c7581
parentb4dc9e69e7c553dd6c1ddb567320a2ce51e8be23 (diff)
Avoid crashes caused by dynamic initialization.
-rw-r--r--src/qtpasssettings.cpp20
-rw-r--r--src/qtpasssettings.h4
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();