From c3ad3ad4195665cf06db09159580cd52dde53901 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Tue, 17 May 2022 10:19:41 +0200 Subject: Fix data race in QCoreApplicationPrivate::sendThroughApplicationEventFilters() The assertion has the acquire fence at the wrong place: - QThreadData::thread isn't dereferenced, so the acquire fence on its load() isn't needed. - QObjectPrivate::threadData, however, _is_ dereferenced, so an acquire fence is needed; the relaxed load() is insufficient. Swapping the loadAcquire() and the loadRelaxed() fixes both issues. Change-Id: Iee964490e93ebc323c188e616bf0d448f91fb2b5 Reviewed-by: Fabian Kosmale (cherry picked from commit 0da17e83ec507229e3516bbdc5986ab775dc843e) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/kernel/qcoreapplication.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/corelib/kernel/qcoreapplication.cpp') diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp index 43ff18fa5c..328e5b29de 100644 --- a/src/corelib/kernel/qcoreapplication.cpp +++ b/src/corelib/kernel/qcoreapplication.cpp @@ -1132,7 +1132,7 @@ static bool doNotify(QObject *receiver, QEvent *event) bool QCoreApplicationPrivate::sendThroughApplicationEventFilters(QObject *receiver, QEvent *event) { // We can't access the application event filters outside of the main thread (race conditions) - Q_ASSERT(receiver->d_func()->threadData.loadRelaxed()->thread.loadAcquire() == mainThread()); + Q_ASSERT(receiver->d_func()->threadData.loadAcquire()->thread.loadRelaxed() == mainThread()); if (extraData) { // application event filters are only called for objects in the GUI thread -- cgit v1.2.3