Skip to content

Commit 0725530

Browse files
committed
Fix recursion in QLoggingRegistry
QLoggingRegistry relies on any Qt code it uses not having category logging in it, because it causes a global variable to be recursively initialized. This has been the case so far, but with CTF tracing enabled, there is Qt code that uses category logging if the first tracing event originates from a logging category, causing the tracing library to be loaded. It is undefined behavior to recurse into the initialization. Here is the backtrace of the situation: QGlobalStatic<QtGlobalStatic::Holder<()::Q_QGS_qtLoggingRegistry> >::instance QGlobalStatic<QtGlobalStatic::Holder<()::Q_QGS_qtLoggingRegistry> >::operator() QLoggingRegistry::instance QLoggingCategoryWithEnvironmentOverride::registerOverride QLoggingCategoryWithEnvironmentOverride::QLoggingCategoryWithEnvironmentOverride QtPrivateLogging::qt_lcDebugPlugins locatePlugin QPluginLoader::setFileName QPluginLoader::QPluginLoader loadPlugin initialize _tracepoint_enabled QtPrivate::trace_QObject_ctor QObject::QObject ... QFile::QFile loadRulesFromFile QLoggingRegistry::initializeRules QLoggingRegistry::QLoggingRegistry (anonymous namespace)::Q_QGS_qtLoggingRegistry::innerFunction QtGlobalStatic::Holder<::Q_QGS_qtLoggingRegistry>::Holder QGlobalStatic<QtGlobalStatic::Holder<::Q_QGS_qtLoggingRegistry> >::instance QGlobalStatic<QtGlobalStatic::Holder<::Q_QGS_qtLoggingRegistry> >::operator() QLoggingRegistry::instance QLoggingCategory::setFilterRules main Add a recursion guard in the QLoggingRegistry that causes QLoggingRegistry::instance to return null if recursion occurs. The internal code appears to handle nullptr well, while external code should always receive a non-null pointer. Fixes: QTBUG-135326 Pick-to: 6.8 6.9 Change-Id: I91f1ff341b096031930004cca8421f2ee0bab9b1 Reviewed-by: Thiago Macieira <[email protected]>
1 parent 7ffa6f1 commit 0725530

File tree

1 file changed

+5
-0
lines changed

1 file changed

+5
-0
lines changed

src/corelib/io/qloggingregistry.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <QtCore/qtextstream.h>
1212
#include <QtCore/qdir.h>
1313
#include <QtCore/qcoreapplication.h>
14+
#include <QtCore/qscopedvaluerollback.h>
1415

1516
#if QT_CONFIG(settings)
1617
#include <QtCore/qsettings.h>
@@ -429,6 +430,10 @@ QLoggingRegistry::installFilter(QLoggingCategory::CategoryFilter filter)
429430

430431
QLoggingRegistry *QLoggingRegistry::instance()
431432
{
433+
Q_CONSTINIT thread_local bool recursionGuard = false;
434+
if (recursionGuard)
435+
return nullptr;
436+
QScopedValueRollback<bool> rollback(recursionGuard, true);
432437
return qtLoggingRegistry();
433438
}
434439

0 commit comments

Comments
 (0)