Skip to content

Commit a10562f

Browse files
Refactor translations to not be a global. Global translations caused a use after free (flameshot-org#4179)
bug because order of destruction for globals is not defined.
1 parent 5cf4406 commit a10562f

File tree

1 file changed

+33
-22
lines changed

1 file changed

+33
-22
lines changed

src/main.cpp

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -108,18 +108,8 @@ QSharedMemory* guiMutexLock()
108108
return shm;
109109
}
110110

111-
QTranslator translator, qtTranslator;
112-
113-
void configureApp(bool gui)
111+
void configureTranslation(QTranslator& translator, QTranslator& qtTranslator)
114112
{
115-
if (gui) {
116-
#if defined(Q_OS_WIN) && QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
117-
QApplication::setStyle("Fusion"); // Supports dark scheme on Win 10/11
118-
#else
119-
QApplication::setStyle(new StyleOverride);
120-
#endif
121-
}
122-
123113
bool foundTranslation;
124114
// Configure translations
125115
for (const QString& path : PathInfo::translationsPaths()) {
@@ -148,24 +138,42 @@ void configureApp(bool gui)
148138
.arg(QLocale::languageToString(
149139
QLocale::system().language()));
150140
}
141+
qApp->installTranslator(&translator);
142+
qApp->installTranslator(&qtTranslator);
143+
}
144+
145+
void configureApp(bool gui, QTranslator& translator, QTranslator& qtTranslator)
146+
{
147+
if (gui) {
148+
#if defined(Q_OS_WIN) && QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
149+
QApplication::setStyle("Fusion"); // Supports dark scheme on Win 10/11
150+
#else
151+
QApplication::setStyle(new StyleOverride);
152+
#endif
153+
}
151154

152155
auto app = QCoreApplication::instance();
153-
app->installTranslator(&translator);
154-
app->installTranslator(&qtTranslator);
155156
app->setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true);
157+
configureTranslation(translator, qtTranslator);
156158
}
157159

158160
// TODO find a way so we don't have to do this
159161
/// Recreate the application as a QApplication
160-
void reinitializeAsQApplication(int& argc, char* argv[])
162+
void reinitializeAsQApplication(int& argc,
163+
char* argv[],
164+
QTranslator& translator,
165+
QTranslator& qtTranslator)
161166
{
162167
delete QCoreApplication::instance();
163168
new QApplication(argc, argv);
164-
configureApp(true);
169+
configureApp(true, translator, qtTranslator);
165170
}
166171

167172
int main(int argc, char* argv[])
168173
{
174+
175+
QTranslator translator, qtTranslator;
176+
169177
// Required for saving button list QList<CaptureTool::Type>
170178
qRegisterMetaType<QList<int>>();
171179

@@ -176,6 +184,7 @@ int main(int argc, char* argv[])
176184
// no arguments, just launch Flameshot
177185
if (argc == 1) {
178186
QApplication app(argc, argv);
187+
configureTranslation(translator, qtTranslator);
179188

180189
#ifdef USE_KDSINGLEAPPLICATION
181190
#ifdef Q_OS_UNIX
@@ -189,7 +198,7 @@ int main(int argc, char* argv[])
189198
}
190199
#endif
191200

192-
configureApp(true);
201+
configureApp(true, translator, qtTranslator);
193202
auto c = Flameshot::instance();
194203
FlameshotDaemon::start();
195204

@@ -210,7 +219,8 @@ int main(int argc, char* argv[])
210219
* CLI parsing |
211220
* ------------*/
212221
new QCoreApplication(argc, argv);
213-
configureApp(false);
222+
configureApp(false, translator, qtTranslator);
223+
214224
CommandLineParser parser;
215225
// Add description
216226
parser.setDescription(
@@ -412,12 +422,13 @@ int main(int argc, char* argv[])
412422
Flameshot::setOrigin(Flameshot::CLI);
413423
if (parser.isSet(helpOption) || parser.isSet(versionOption)) {
414424
} else if (parser.isSet(launcherArgument)) { // LAUNCHER
415-
reinitializeAsQApplication(argc, argv);
425+
reinitializeAsQApplication(argc, argv, translator, qtTranslator);
416426
Flameshot* flameshot = Flameshot::instance();
417427
flameshot->launcher();
418428
qApp->exec();
419429
} else if (parser.isSet(guiArgument)) { // GUI
420-
reinitializeAsQApplication(argc, argv);
430+
reinitializeAsQApplication(argc, argv, translator, qtTranslator);
431+
421432
// Prevent multiple instances of 'flameshot gui' from running if not
422433
// configured to do so.
423434
if (!ConfigHandler().allowMultipleGuiInstances()) {
@@ -480,7 +491,7 @@ int main(int argc, char* argv[])
480491
}
481492
return requestCaptureAndWait(req);
482493
} else if (parser.isSet(fullArgument)) { // FULL
483-
reinitializeAsQApplication(argc, argv);
494+
reinitializeAsQApplication(argc, argv, translator, qtTranslator);
484495

485496
// Option values
486497
QString path = parser.value(pathOption);
@@ -515,7 +526,7 @@ int main(int argc, char* argv[])
515526
}
516527
return requestCaptureAndWait(req);
517528
} else if (parser.isSet(screenArgument)) { // SCREEN
518-
reinitializeAsQApplication(argc, argv);
529+
reinitializeAsQApplication(argc, argv, translator, qtTranslator);
519530

520531
QString numberStr = parser.value(screenNumberOption);
521532
// Option values
@@ -587,7 +598,7 @@ int main(int argc, char* argv[])
587598
}
588599
if (!someFlagSet) {
589600
// Open gui when no options are given
590-
reinitializeAsQApplication(argc, argv);
601+
reinitializeAsQApplication(argc, argv, translator, qtTranslator);
591602
QObject::connect(
592603
qApp, &QApplication::lastWindowClosed, qApp, &QApplication::quit);
593604
Flameshot::instance()->config();

0 commit comments

Comments
 (0)