Details
-
Bug
-
Resolution: Done
-
P3: Somewhat important
-
5.8
-
None
-
clang version 3.9.1 (tags/RELEASE_391/final 289600)
Linux, X11, qtbase from git 5.8
-
da38f0d691d9d7eacfac5fbcbd47b887bd59bd39 65b8f59e045bb41fef99b1a44f462115de65064a 787e498487831c55be89979824709622ba29f17c (qt/qtbase/5.12)
Description
Using QNAM in two threads shows this data race, when compiled with clang+tsan:
WARNING: ThreadSanitizer: data race (pid=8511) Atomic write of size 8 at 0x7d040000b760 by thread T9: #0 __tsan_atomic64_compare_exchange_val /home/abuild/rpmbuild/BUILD/llvm-3.9.1.src/projects/compiler-rt/lib/tsan/rtl/tsan_interface_atomic.cc:826:3 (convertertest+0x000000487e3a) #1 std::__1::__atomic_base<QMutexData*, false>::compare_exchange_strong(QMutexData*&, QMutexData*, std::__1::memory_order) /usr/bin/../include/c++/v1/atomic:936:17 (libQt5Core.so.5+0x0000000e4660) #2 bool QAtomicOps<QMutexData*>::testAndSetAcquire<QMutexData*>(std::__1::atomic<QMutexData*>&, QMutexData*, QMutexData*, QMutexData**) /d/qt/5/kdab/qtbase-dev/build/src/corelib/../../include/QtCore/../../../src/corelib/arch/qatomic_cxx11.h:290 (libQt5Core.so.5+0x0000000e4660) #3 QBasicAtomicPointer<QMutexData>::testAndSetAcquire(QMutexData*, QMutexData*, QMutexData*&) /d/qt/5/kdab/qtbase-dev/build/src/corelib/../../include/QtCore/../../../src/corelib/thread/qbasicatomic.h:262:14 (libQt5Core.so.5+0x0000000e4308) #4 QBasicMutex::fastTryLock(QMutexData*&) /d/qt/5/kdab/qtbase-dev/build/src/corelib/../../include/QtCore/../../../src/corelib/thread/qmutex.h:101:22 (libQt5Core.so.5+0x0000000e3e36) #5 QMutex::lock() /d/qt/5/kdab/qtbase-dev/src/corelib/thread/qmutex.cpp:224:9 (libQt5Core.so.5+0x0000000e31d6) #6 QMutexLocker::QMutexLocker(QBasicMutex*) /d/qt/5/kdab/qtbase-dev/build/src/network/../../include/QtCore/../../../src/corelib/thread/qmutex.h:200:39 (libQt5Network.so.5+0x0000000a0b80) #7 q_resolveOpenSslSymbols() /d/qt/5/kdab/qtbase-dev/src/network/ssl/qsslsocket_openssl_symbols.cpp:763:18 (libQt5Network.so.5+0x00000026158b) #8 QSslSocketPrivate::ensureLibraryLoaded() /d/qt/5/kdab/qtbase-dev/src/network/ssl/qsslsocket_openssl.cpp:534:10 (libQt5Network.so.5+0x00000024e055) #9 QSslSocketPrivate::supportsSsl() /d/qt/5/kdab/qtbase-dev/src/network/ssl/qsslsocket_openssl.cpp:529:12 (libQt5Network.so.5+0x00000024e025) #10 QSslSocketPrivate::ensureInitialized() /d/qt/5/kdab/qtbase-dev/src/network/ssl/qsslsocket_openssl.cpp:627:10 (libQt5Network.so.5+0x00000024c601) #11 QSslCertificatePrivate::QSslCertificatePrivate() /d/qt/5/kdab/qtbase-dev/src/network/ssl/qsslcertificate_p.h:86:9 (libQt5Network.so.5+0x000000224c4e) #12 QSslCertificate::QSslCertificate(QByteArray const&, QSsl::EncodingFormat) /d/qt/5/kdab/qtbase-dev/src/network/ssl/qsslcertificate.cpp:157:13 (libQt5Network.so.5+0x000000223704) #13 QSslConfigurationPrivate::QSslConfigurationPrivate() /d/qt/5/kdab/qtbase-dev/src/network/ssl/qsslconfiguration_p.h:84:5 (libQt5Network.so.5+0x000000228706) #14 QSslConfiguration::QSslConfiguration() /d/qt/5/kdab/qtbase-dev/src/network/ssl/qsslconfiguration.cpp:156:13 (libQt5Network.so.5+0x00000022692f) #15 QNetworkReplyHttpImplPrivate::QNetworkReplyHttpImplPrivate() /d/qt/5/kdab/qtbase-dev/src/network/access/qnetworkreplyhttpimpl.cpp:426:31 (libQt5Network.so.5+0x0000000e90c9) #16 QNetworkReplyHttpImpl::QNetworkReplyHttpImpl(QNetworkAccessManager*, QNetworkRequest const&, QNetworkAccessManager::Operation&, QIODevice*) /d/qt/5/kdab/qtbase-dev/src/network/access/qnetworkreplyhttpimpl.cpp:172:26 (libQt5Network.so.5+0x0000000e555b) #17 QNetworkAccessManager::createRequest(QNetworkAccessManager::Operation, QNetworkRequest const&, QIODevice*) /d/qt/5/kdab/qtbase-dev/src/network/access/qnetworkaccessmanager.cpp:1410:44 (libQt5Network.so.5+0x0000000a75b7) #18 QNetworkAccessManager::get(QNetworkRequest const&) /d/qt/5/kdab/qtbase-dev/src/network/access/qnetworkaccessmanager.cpp:808:34 (libQt5Network.so.5+0x0000000a48bc) Previous write of size 8 at 0x7d040000b760 by thread T3: #0 operator new(unsigned long) /home/abuild/rpmbuild/BUILD/llvm-3.9.1.src/projects/compiler-rt/lib/tsan/rtl/tsan_new_delete.cc:41:3 (convertertest+0x0000004a1742) #1 QMutexPool::createMutex(int) /d/qt/5/kdab/qtbase-dev/src/corelib/thread/qmutexpool.cpp:133:24 (libQt5Core.so.5+0x0000000ed0df) #2 QMutexPool::get(void const*) /d/qt/5/kdab/qtbase-dev/src/corelib/thread/qmutexpool_p.h:75:20 (libQt5Core.so.5+0x0000000eda21) #3 QMutexPool::globalInstanceGet(void const*) /d/qt/5/kdab/qtbase-dev/src/corelib/thread/qmutexpool.cpp:147:28 (libQt5Core.so.5+0x0000000ed214) #4 q_resolveOpenSslSymbols() /d/qt/5/kdab/qtbase-dev/src/network/ssl/qsslsocket_openssl_symbols.cpp:763:25 (libQt5Network.so.5+0x00000026157f) #5 QSslSocketPrivate::ensureLibraryLoaded() /d/qt/5/kdab/qtbase-dev/src/network/ssl/qsslsocket_openssl.cpp:534:10 (libQt5Network.so.5+0x00000024e055) #6 QSslSocketPrivate::supportsSsl() /d/qt/5/kdab/qtbase-dev/src/network/ssl/qsslsocket_openssl.cpp:529:12 (libQt5Network.so.5+0x00000024e025) #7 QSslSocketPrivate::ensureInitialized() /d/qt/5/kdab/qtbase-dev/src/network/ssl/qsslsocket_openssl.cpp:627:10 (libQt5Network.so.5+0x00000024c601) #8 QSslCertificatePrivate::QSslCertificatePrivate() /d/qt/5/kdab/qtbase-dev/src/network/ssl/qsslcertificate_p.h:86:9 (libQt5Network.so.5+0x000000224c4e) #9 QSslCertificate::QSslCertificate(QByteArray const&, QSsl::EncodingFormat) /d/qt/5/kdab/qtbase-dev/src/network/ssl/qsslcertificate.cpp:157:13 (libQt5Network.so.5+0x000000223704) #10 QSslConfigurationPrivate::QSslConfigurationPrivate() /d/qt/5/kdab/qtbase-dev/src/network/ssl/qsslconfiguration_p.h:84:5 (libQt5Network.so.5+0x000000228706) #11 QSslConfiguration::QSslConfiguration() /d/qt/5/kdab/qtbase-dev/src/network/ssl/qsslconfiguration.cpp:156:13 (libQt5Network.so.5+0x00000022692f) #12 QNetworkReplyHttpImplPrivate::QNetworkReplyHttpImplPrivate() /d/qt/5/kdab/qtbase-dev/src/network/access/qnetworkreplyhttpimpl.cpp:426:31 (libQt5Network.so.5+0x0000000e90c9) #13 QNetworkReplyHttpImpl::QNetworkReplyHttpImpl(QNetworkAccessManager*, QNetworkRequest const&, QNetworkAccessManager::Operation&, QIODevice*) /d/qt/5/kdab/qtbase-dev/src/network/access/qnetworkreplyhttpimpl.cpp:172:26 (libQt5Network.so.5+0x0000000e555b) #14 QNetworkAccessManager::createRequest(QNetworkAccessManager::Operation, QNetworkRequest const&, QIODevice*) /d/qt/5/kdab/qtbase-dev/src/network/access/qnetworkaccessmanager.cpp:1410:44 (libQt5Network.so.5+0x0000000a75b7) #15 QNetworkAccessManager::get(QNetworkRequest const&) /d/qt/5/kdab/qtbase-dev/src/network/access/qnetworkaccessmanager.cpp:808:34 (libQt5Network.so.5+0x0000000a48bc) Location is heap block of size 8 at 0x7d040000b760 allocated by thread T3: #0 operator new(unsigned long) /home/abuild/rpmbuild/BUILD/llvm-3.9.1.src/projects/compiler-rt/lib/tsan/rtl/tsan_new_delete.cc:41:3 (convertertest+0x0000004a1742) #1 QMutexPool::createMutex(int) /d/qt/5/kdab/qtbase-dev/src/corelib/thread/qmutexpool.cpp:133:24 (libQt5Core.so.5+0x0000000ed0df) #2 QMutexPool::get(void const*) /d/qt/5/kdab/qtbase-dev/src/corelib/thread/qmutexpool_p.h:75:20 (libQt5Core.so.5+0x0000000eda21) #3 QMutexPool::globalInstanceGet(void const*) /d/qt/5/kdab/qtbase-dev/src/corelib/thread/qmutexpool.cpp:147:28 (libQt5Core.so.5+0x0000000ed214) #4 q_resolveOpenSslSymbols() /d/qt/5/kdab/qtbase-dev/src/network/ssl/qsslsocket_openssl_symbols.cpp:763:25 (libQt5Network.so.5+0x00000026157f)
Attachments
For Gerrit Dashboard: QTBUG-59164 | ||||||
---|---|---|---|---|---|---|
# | Subject | Branch | Project | Status | CR | V |
186886,2 | Remove the last remaining non-SSL use of QMutexPool in Qt | 5.8 | qt/qtbase | Status: MERGED | +2 | 0 |
187509,2 | Port the SSL code away from QMutexPool | 5.8 | qt/qtbase | Status: ABANDONED | 0 | 0 |
266742,3 | QMutexPool: fix memory order of atomic operations | 5.12 | qt/qtbase | Status: MERGED | +2 | 0 |