-
Bug
-
Resolution: Done
-
P3: Somewhat important
-
5.3.0
-
None
void QDBusConnectionPrivate::registerServiceNoLock(const QString &serviceName)
{
serviceNames.append(serviceName);
}
(in the main thread) races with
bool QDBusConnectionPrivate::isServiceRegisteredByThread(const QString &serviceName) const { if (!serviceName.isEmpty() && serviceName == baseService) return true; QStringList copy = serviceNames; return copy.contains(serviceName); }
(in a secondary thread)
This code (the faulty "NoLock" slot) was introduced by 5e257bd44fa4a76f4c2c573a6c5623802022ff18.
WARNING: ThreadSanitizer: data race (pid=14622)
Write of size 8 at 0x7d44000097e0 by thread T9:
#0 QListData::detach_grow(int*, int) /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/tools/qlist.cpp:112 (libQt5Core.so.5+0x0000002f2ea6)
#1 QList<QString>::detach_helper_grow(int, int) /s/qt/5/kdab/qt5-clang/build/qtbase/src/dbus/../../include/QtCore/../../../../qtbase/src/corelib/tools/qlist.h:689 (libQt5DBus.so.5+0x00000006178d)
#2 QList<QString>::append(QString const&) /s/qt/5/kdab/qt5-clang/build/qtbase/src/dbus/../../include/QtCore/../../../../qtbase/src/corelib/tools/qlist.h:520 (libQt5DBus.so.5+0x0000000512be)
#3 QDBusConnectionPrivate::registerServiceNoLock(QString const&) /d/qt/5/kdab/qt5-clang/qtbase/src/dbus/qdbusintegrator.cpp:2477 (libQt5DBus.so.5+0x000000047487)
#4 QDBusConnectionPrivate::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) /s/qt/5/kdab/qt5-clang/build/qtbase/src/dbus/.moc/moc_qdbusconnection_p.cpp:135 (libQt5DBus.so.5+0x000000112f4a)
#5 QDBusConnectionPrivate::qt_metacall(QMetaObject::Call, int, void**) /s/qt/5/kdab/qt5-clang/build/qtbase/src/dbus/.moc/moc_qdbusconnection_p.cpp:202 (libQt5DBus.so.5+0x000000113bd2)
#6 QDBusConnectionPrivate::deliverCall(QObject*, int, QDBusMessage const&, QVector<int> const&, int) /d/qt/5/kdab/qt5-clang/qtbase/src/dbus/qdbusintegrator.cpp:991 (libQt5DBus.so.5+0x00000002fee2)
#7 QDBusConnectionPrivate::activateSignal(QDBusConnectionPrivate::SignalHook const&, QDBusMessage const&) /d/qt/5/kdab/qt5-clang/qtbase/src/dbus/qdbusintegrator.cpp:813 (libQt5DBus.so.5+0x00000002f0dc)
#8 QDBusConnectionPrivate::handleSignal(QString const&, QDBusMessage const&) /d/qt/5/kdab/qt5-clang/qtbase/src/dbus/qdbusintegrator.cpp:1634 (libQt5DBus.so.5+0x00000003ba6b)
#9 QDBusConnectionPrivate::handleSignal(QDBusMessage const&) /d/qt/5/kdab/qt5-clang/qtbase/src/dbus/qdbusintegrator.cpp:1653 (libQt5DBus.so.5+0x00000002e1a8)
#10 QDBusConnectionPrivate::handleMessage(QDBusMessage const&) /d/qt/5/kdab/qt5-clang/qtbase/src/dbus/qdbusintegrator.cpp:578 (libQt5DBus.so.5+0x00000002df87)
#11 qDBusSignalFilter(DBusConnection*, DBusMessage*, void*) /d/qt/5/kdab/qt5-clang/qtbase/src/dbus/qdbusintegrator.cpp:559 (libQt5DBus.so.5+0x00000003f23f)
#12 dbus_connection_dispatch /usr/src/debug/dbus-1.7.4/dbus/dbus-connection.c:4652 (libdbus-1.so.3+0x0000000108e5)
#13 QDBusConnectionPrivate::doDispatch() /d/qt/5/kdab/qt5-clang/qtbase/src/dbus/qdbusintegrator.cpp:1178 (libQt5DBus.so.5+0x00000003377a)
#14 QDBusConnectionPrivate::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) /s/qt/5/kdab/qt5-clang/build/qtbase/src/dbus/.moc/moc_qdbusconnection_p.cpp:129 (libQt5DBus.so.5+0x000000112b25)
#15 QMetaCallEvent::placeMetaCall(QObject*) /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/kernel/qobject.cpp:489 (libQt5Core.so.5+0x000000833978)
#16 QObject::event(QEvent*) /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/kernel/qobject.cpp:1249 (libQt5Core.so.5+0x000000837e6e)
#17 QCoreApplicationPrivate::notify_helper(QObject*, QEvent*) /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/kernel/qcoreapplication.cpp:1057 (libQt5Core.so.5+0x000000776582)
#18 QCoreApplication::notify(QObject*, QEvent*) /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/kernel/qcoreapplication.cpp:1002 (libQt5Core.so.5+0x0000007763cd)
#19 QCoreApplication::notifyInternal(QObject*, QEvent*) /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/kernel/qcoreapplication.cpp:940 (libQt5Core.so.5+0x00000077611e)
#20 QCoreApplication::sendEvent(QObject*, QEvent*) /s/qt/5/kdab/qt5-clang/build/qtbase/src/corelib/../../include/QtCore/../../../../qtbase/src/corelib/kernel/qcoreapplication.h:237 (libQt5Core.so.5+0x0000007806fa)
#21 QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/kernel/qcoreapplication.cpp:1544 (libQt5Core.so.5+0x0000007791f7)
#22 QCoreApplication::sendPostedEvents(QObject*, int) /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/kernel/qcoreapplication.cpp:1402 (libQt5Core.so.5+0x0000007775f4)
#23 postEventSourceDispatch(_GSource*, int (*)(void*), void*) /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:279 (libQt5Core.so.5+0x0000008ef9e8)
#24 g_main_dispatch /usr/src/debug/glib-2.38.2/glib/gmain.c:3066 (libglib-2.0.so.0+0x00000004b315)
#25 QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/kernel/qeventloop.cpp:136 (libQt5Core.so.5+0x00000076ca36)
#26 QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/kernel/qeventloop.cpp:212 (libQt5Core.so.5+0x00000076cecd)
#27 QThread::exec() /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/thread/qthread.cpp:511 (libQt5Core.so.5+0x00000010dfcf)
#28 tst_QDBusThreading::callbackInMainThread_thread() /d/qt/5/kdab/qt5-clang/qtbase/tests/auto/dbus/qdbusthreading/tst_qdbusthreading.cpp:514 (exe+0x000000052052)
#29 tst_QDBusThreading::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) /d/qt/5/kdab/qt5-clang/build/qtbase/tests/auto/dbus/qdbusthreading/.moc/tst_qdbusthreading.moc:244 (exe+0x000000053e7d)
#30 QMetaMethod::invoke(QObject*, Qt::ConnectionType, QGenericReturnArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument) const /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/kernel/qmetaobject.cpp:2169 (libQt5Core.so.5+0x000000797476)
#31 QMetaObject::invokeMethod(QObject*, char const*, Qt::ConnectionType, QGenericReturnArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument) /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/kernel/qmetaobject.cpp:1463 (libQt5Core.so.5+0x000000796585)
#32 QMetaObject::invokeMethod(QObject*, char const*, Qt::ConnectionType, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument) /d/qt/5/kdab/qt5-clang/build/qtbase/tests/auto/dbus/qdbusthreading/../../../../include/QtCore/../../../../qtbase/src/corelib/kernel/qobjectdefs.h:398 (exe+0x000000056095)
#33 Thread::run() /d/qt/5/kdab/qt5-clang/qtbase/tests/auto/dbus/qdbusthreading/tst_qdbusthreading.cpp:200 (exe+0x00000004a749)
#34 QThreadPrivate::start(void*) /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/thread/qthread_unix.cpp:345 (libQt5Core.so.5+0x0000001247c3)
Previous read of size 8 at 0x7d44000097e0 by main thread:
#0 QList /s/qt/5/kdab/qt5-clang/build/qtbase/src/dbus/../../include/QtCore/../../../../qtbase/src/corelib/tools/qlist.h:741 (libQt5DBus.so.5+0x00000002a58e)
#1 QStringList /s/qt/5/kdab/qt5-clang/build/qtbase/src/dbus/../../include/QtCore/../../../../qtbase/src/corelib/tools/qstringlist.h:61 (libQt5DBus.so.5+0x00000002a503)
#2 QStringList /s/qt/5/kdab/qt5-clang/build/qtbase/src/dbus/../../include/QtCore/../../../../qtbase/src/corelib/tools/qstringlist.h:61 (libQt5DBus.so.5+0x00000002a2a0)
#3 QDBusConnectionPrivate::isServiceRegisteredByThread(QString const&) const /d/qt/5/kdab/qt5-clang/qtbase/src/dbus/qdbusintegrator.cpp:2495 (libQt5DBus.so.5+0x000000041bee)
#4 QDBusConnectionPrivate::sendWithReplyAsync(QDBusMessage const&, QObject*, char const*, char const*, int) /d/qt/5/kdab/qt5-clang/qtbase/src/dbus/qdbusintegrator.cpp:2036 (libQt5DBus.so.5+0x00000004254a)
#5 QDBusConnection::callWithCallback(QDBusMessage const&, QObject*, char const*, char const*, int) const /d/qt/5/kdab/qt5-clang/qtbase/src/dbus/qdbusconnection.cpp:523 (libQt5DBus.so.5+0x000000016576)
#6 QDBusAbstractInterface::callWithCallback(QString const&, QList<QVariant> const&, QObject*, char const*, char const*) /d/qt/5/kdab/qt5-clang/qtbase/src/dbus/qdbusabstractinterface.cpp:560 (libQt5DBus.so.5+0x00000007ca03)
#7 QDBusAbstractInterface::callWithCallback(QString const&, QList<QVariant> const&, QObject*, char const*) /d/qt/5/kdab/qt5-clang/qtbase/src/dbus/qdbusabstractinterface.cpp:590 (libQt5DBus.so.5+0x00000007cb8d)
#8 tst_QDBusThreading::callbackInMainThread() /d/qt/5/kdab/qt5-clang/qtbase/tests/auto/dbus/qdbusthreading/tst_qdbusthreading.cpp:527 (exe+0x0000000522c5)
#9 tst_QDBusThreading::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) /d/qt/5/kdab/qt5-clang/build/qtbase/tests/auto/dbus/qdbusthreading/.moc/tst_qdbusthreading.moc:256 (exe+0x000000053fb5)
#10 QMetaMethod::invoke(QObject*, Qt::ConnectionType, QGenericReturnArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument) const /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/kernel/qmetaobject.cpp:2169 (libQt5Core.so.5+0x000000797476)
#11 QMetaObject::invokeMethod(QObject*, char const*, Qt::ConnectionType, QGenericReturnArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument) /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/kernel/qmetaobject.cpp:1463 (libQt5Core.so.5+0x000000796585)
#12 QMetaObject::invokeMethod(QObject*, char const*, Qt::ConnectionType, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument) /s/qt/5/kdab/qt5-clang/build/qtbase/src/testlib/../../include/QtCore/../../../../qtbase/src/corelib/kernel/qobjectdefs.h:398 (libQt5Test.so.5+0x0000000271f5)
#13 QTest::qInvokeTestMethodDataEntry(char*) /d/qt/5/kdab/qt5-clang/qtbase/src/testlib/qtestcase.cpp:1889 (libQt5Test.so.5+0x000000018969)
#14 QTest::qInvokeTestMethod(char const*, char const*) /d/qt/5/kdab/qt5-clang/qtbase/src/testlib/qtestcase.cpp:2015 (libQt5Test.so.5+0x000000017f32)
#15 QTest::qInvokeTestMethods(QObject*) /d/qt/5/kdab/qt5-clang/qtbase/src/testlib/qtestcase.cpp:2242 (libQt5Test.so.5+0x000000012d6f)
#16 QTest::qExec(QObject*, int, char**) /d/qt/5/kdab/qt5-clang/qtbase/src/testlib/qtestcase.cpp:2475 (libQt5Test.so.5+0x0000000122dd)
#17 main /d/qt/5/kdab/qt5-clang/qtbase/tests/auto/dbus/qdbusthreading/tst_qdbusthreading.cpp:612 (exe+0x000000053739)
Location is heap block of size 264 at 0x7d4400009740 allocated by thread T9:
#0 malloc /home/abuild/rpmbuild/BUILD/llvm-3.3/projects/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc:421 (exe+0x000000010a96)
#1 <null> <null>:0 (libstdc++.so.6+0x000000063ebc)
#2 tst_QDBusThreading::callbackInMainThread_thread() /d/qt/5/kdab/qt5-clang/qtbase/tests/auto/dbus/qdbusthreading/tst_qdbusthreading.cpp:511 (exe+0x00000005201c)
#3 tst_QDBusThreading::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) /d/qt/5/kdab/qt5-clang/build/qtbase/tests/auto/dbus/qdbusthreading/.moc/tst_qdbusthreading.moc:244 (exe+0x000000053e7d)
#4 QMetaMethod::invoke(QObject*, Qt::ConnectionType, QGenericReturnArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument) const /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/kernel/qmetaobject.cpp:2169 (libQt5Core.so.5+0x000000797476)
#5 QMetaObject::invokeMethod(QObject*, char const*, Qt::ConnectionType, QGenericReturnArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument) /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/kernel/qmetaobject.cpp:1463 (libQt5Core.so.5+0x000000796585)
#6 QMetaObject::invokeMethod(QObject*, char const*, Qt::ConnectionType, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument) /d/qt/5/kdab/qt5-clang/build/qtbase/tests/auto/dbus/qdbusthreading/../../../../include/QtCore/../../../../qtbase/src/corelib/kernel/qobjectdefs.h:398 (exe+0x000000056095)
#7 Thread::run() /d/qt/5/kdab/qt5-clang/qtbase/tests/auto/dbus/qdbusthreading/tst_qdbusthreading.cpp:200 (exe+0x00000004a749)
#8 QThreadPrivate::start(void*) /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/thread/qthread_unix.cpp:345 (libQt5Core.so.5+0x0000001247c3)
Thread T9 'Aux thread 9' (tid=14632, running) created by main thread at:
#0 pthread_create /home/abuild/rpmbuild/BUILD/llvm-3.3/projects/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc:812 (exe+0x000000013f70)
#1 QThread::start(QThread::Priority) /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/thread/qthread_unix.cpp:624 (libQt5Core.so.5+0x000000125d73)
#2 Thread /d/qt/5/kdab/qt5-clang/qtbase/tests/auto/dbus/qdbusthreading/tst_qdbusthreading.cpp:192 (exe+0x00000004a383)
#3 tst_QDBusThreading::callbackInMainThread() /d/qt/5/kdab/qt5-clang/qtbase/tests/auto/dbus/qdbusthreading/tst_qdbusthreading.cpp:520 (exe+0x0000000521bd)
#4 tst_QDBusThreading::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) /d/qt/5/kdab/qt5-clang/build/qtbase/tests/auto/dbus/qdbusthreading/.moc/tst_qdbusthreading.moc:256 (exe+0x000000053fb5)
#5 QMetaMethod::invoke(QObject*, Qt::ConnectionType, QGenericReturnArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument) const /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/kernel/qmetaobject.cpp:2169 (libQt5Core.so.5+0x000000797476)
#6 QMetaObject::invokeMethod(QObject*, char const*, Qt::ConnectionType, QGenericReturnArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument) /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/kernel/qmetaobject.cpp:1463 (libQt5Core.so.5+0x000000796585)
#7 QMetaObject::invokeMethod(QObject*, char const*, Qt::ConnectionType, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument) /s/qt/5/kdab/qt5-clang/build/qtbase/src/testlib/../../include/QtCore/../../../../qtbase/src/corelib/kernel/qobjectdefs.h:398 (libQt5Test.so.5+0x0000000271f5)
#8 QTest::qInvokeTestMethodDataEntry(char*) /d/qt/5/kdab/qt5-clang/qtbase/src/testlib/qtestcase.cpp:1889 (libQt5Test.so.5+0x000000018969)
#9 QTest::qInvokeTestMethod(char const*, char const*) /d/qt/5/kdab/qt5-clang/qtbase/src/testlib/qtestcase.cpp:2015 (libQt5Test.so.5+0x000000017f32)
#10 QTest::qInvokeTestMethods(QObject*) /d/qt/5/kdab/qt5-clang/qtbase/src/testlib/qtestcase.cpp:2242 (libQt5Test.so.5+0x000000012d6f)
#11 QTest::qExec(QObject*, int, char**) /d/qt/5/kdab/qt5-clang/qtbase/src/testlib/qtestcase.cpp:2475 (libQt5Test.so.5+0x0000000122dd)
#12 main /d/qt/5/kdab/qt5-clang/qtbase/tests/auto/dbus/qdbusthreading/tst_qdbusthreading.cpp:612 (exe+0x000000053739)
SUMMARY: ThreadSanitizer: data race /d/qt/5/kdab/qt5-clang/qtbase/src/corelib/tools/qlist.cpp:112 QListData::detach_grow(int*, int)
==================
PASS : tst_QDBusThreading::callbackInMainThread()
- relates to
-
QTBUG-39528 QDBusConnection::sessionBus() is not threadsafe
-
- Closed
-
| For Gerrit Dashboard: QTBUG-39285 | ||||||
|---|---|---|---|---|---|---|
| # | Subject | Branch | Project | Status | CR | V |
| 87074,2 | Fix data race in accessing QDBusConnectionPrivate::serviceNames | 5.3 | qt/qtbase | Status: MERGED | +2 | 0 |