Skip to content

Add a mutex to protect globalData

Albert Astals Cid requested to merge work/aacid/kconfig_glodaldata_mutex into master

Should fix this crash in a kio test

==11408==ERROR: AddressSanitizer: heap-use-after-free on address 0x5040000107d0 at pc 0x7f30bb9585bf bp 0x7f30b0edcda0 sp 0x7f30b0edcd98
WRITE of size 4 at 0x5040000107d0 thread T6 (Thread (pooled))
    #0 0x7f30bb9585be in std::__atomic_base<int>::fetch_sub(int, std::memory_order) /usr/include/c++/13/bits/atomic_base.h:645
    #1 0x7f30bb9585be in bool QAtomicOps<int>::deref<int>(std::atomic<int>&) /usr/include/qt6/QtCore/qatomic_cxx11.h:266
    #2 0x7f30bb94be1b in QBasicAtomicInteger<int>::deref() /usr/include/qt6/QtCore/qbasicatomic.h:48
    #3 0x7f30bb93ef63 in QArrayData::deref() /usr/include/qt6/QtCore/qarraydata.h:65
    #4 0x7f30bb959615 in QArrayDataPointer<QString>::deref() /usr/include/qt6/QtCore/qarraydatapointer.h:439
    #5 0x7f30bb94dcf5 in QArrayDataPointer<QString>::~QArrayDataPointer() /usr/include/qt6/QtCore/qarraydatapointer.h:108
    #6 0x7f30bb944e1b in QList<QString>::~QList() /usr/include/qt6/QtCore/qlist.h:70
    #7 0x7f30bb9313b4 in KConfig::mainConfigName() /builds/frameworks/kconfig/src/core/kconfig.cpp:609
    #8 0x7f30bba26f9b in KSharedConfig::openConfig(QString const&, QFlags<KConfig::OpenFlag>, QStandardPaths::StandardLocation) /builds/frameworks/kconfig/src/core/ksharedconfig.cpp:73
    #9 0x7f30bed31110 in KIO::WorkerConfigPrivate::readGlobalConfig() /builds/frameworks/kio/src/core/workerconfig.cpp:63
    #10 0x7f30bed32d5a in KIO::WorkerConfig::WorkerConfig() /builds/frameworks/kio/src/core/workerconfig.cpp:154
    #11 0x7f30bed34b61 in KIO::WorkerConfigSingleton::WorkerConfigSingleton() /builds/frameworks/kio/src/core/workerconfig.cpp:124
    #12 0x7f30bed34ccf in KIO::WorkerConfigSingleton* KIO::perThreadGlobalStatic<KIO::WorkerConfigSingleton>() /builds/frameworks/kio/src/core/workerconfig.cpp:135
    #13 0x7f30bed32c0e in KIO::_workerConfigSelf() /builds/frameworks/kio/src/core/workerconfig.cpp:143
    #14 0x7f30bed32c44 in KIO::WorkerConfig::self() /builds/frameworks/kio/src/core/workerconfig.cpp:148
    #15 0x7f30beab378a in KIO::SchedulerPrivate::metaDataFor(QString const&, QList<QString> const&, QUrl const&) /builds/frameworks/kio/src/core/scheduler.cpp:773
    #16 0x7f30beab4dca in KIO::SchedulerPrivate::setupWorker(KIO::Worker*, QUrl const&, QString const&, QList<QString> const&, bool, KIO::MetaData const*) /builds/frameworks/kio/src/core/scheduler.cpp:802
    #17 0x7f30beab00d5 in KIO::ProtoQueue::startAJob() /builds/frameworks/kio/src/core/scheduler.cpp:556
    #18 0x7f30beaf8f9b in QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (KIO::ProtoQueue::*)()>::call(void (KIO::ProtoQueue::*)(), KIO::ProtoQueue*, void**) /usr/include/qt6/QtCore/qobjectdefs_impl.h:145
    #19 0x7f30beaf0c8f in void QtPrivate::FunctionPointer<void (KIO::ProtoQueue::*)()>::call<QtPrivate::List<>, void>(void (KIO::ProtoQueue::*)(), KIO::ProtoQueue*, void**) /usr/include/qt6/QtCore/qobjectdefs_impl.h:182
    #20 0x7f30beae5557 in QtPrivate::QCallableObject<void (KIO::ProtoQueue::*)(), QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) /usr/include/qt6/QtCore/qobjectdefs_impl.h:553
    #21 0x7f30b9bc2422  (/lib64/libQt6Core.so.6+0x1e8422) (BuildId: b381724dca6ded0e900824321c27b29af70a08b1)
    #22 0x7f30b9bc6af9 in QTimer::timeout(QTimer::QPrivateSignal) (/lib64/libQt6Core.so.6+0x1ecaf9) (BuildId: b381724dca6ded0e900824321c27b29af70a08b1)
    #23 0x7f30b9bac225 in QObject::event(QEvent*) (/lib64/libQt6Core.so.6+0x1d2225) (BuildId: b381724dca6ded0e900824321c27b29af70a08b1)
    #24 0x7f30b9b68ffe in QCoreApplication::notifyInternal2(QObject*, QEvent*) (/lib64/libQt6Core.so.6+0x18effe) (BuildId: b381724dca6ded0e900824321c27b29af70a08b1)
    #25 0x7f30b9cc6779 in QTimerInfoList::activateTimers() (/lib64/libQt6Core.so.6+0x2ec779) (BuildId: b381724dca6ded0e900824321c27b29af70a08b1)
    #26 0x7f30b9d9bd73  (/lib64/libQt6Core.so.6+0x3c1d73) (BuildId: b381724dca6ded0e900824321c27b29af70a08b1)
    #27 0x7f30b7f6a73f  (/lib64/libglib-2.0.so.0+0x5d73f) (BuildId: 2cf7471b35e06666a442d9fff3cb06cb606f6753)
    #28 0x7f30b7f6c387  (/lib64/libglib-2.0.so.0+0x5f387) (BuildId: 2cf7471b35e06666a442d9fff3cb06cb606f6753)
    #29 0x7f30b7f6ca3b in g_main_context_iteration (/lib64/libglib-2.0.so.0+0x5fa3b) (BuildId: 2cf7471b35e06666a442d9fff3cb06cb606f6753)
    #30 0x7f30b9d9aa0b in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (/lib64/libQt6Core.so.6+0x3c0a0b) (BuildId: b381724dca6ded0e900824321c27b29af70a08b1)
    #31 0x7f30b9b7379a in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) (/lib64/libQt6Core.so.6+0x19979a) (BuildId: b381724dca6ded0e900824321c27b29af70a08b1)
    #32 0x7f30bab2d17b in KJob::exec() /builds/frameworks/kcoreaddons/src/lib/jobs/kjob.cpp:196
    #33 0x22439b in KIOThreadTest::copyLocalFile(KIOThreadTest::FileData*) /builds/frameworks/kio/autotests/threadtest.cpp:63
    #34 0x2397f2 in bool std::__invoke_impl<bool, bool (KIOThreadTest::*&)(KIOThreadTest::FileData*), KIOThreadTest*&, KIOThreadTest::FileData*&>(std::__invoke_memfun_deref, bool (KIOThreadTest::*&)(KIOThreadTest::FileData*), KIOThreadTest*&, KIOThreadTest::FileData*&) /usr/include/c++/13/bits/invoke.h:74
    #35 0x238ff8 in std::__invoke_result<bool (KIOThreadTest::*&)(KIOThreadTest::FileData*), KIOThreadTest*&, KIOThreadTest::FileData*&>::type std::__invoke<bool (KIOThreadTest::*&)(KIOThreadTest::FileData*), KIOThreadTest*&, KIOThreadTest::FileData*&>(bool (KIOThreadTest::*&)(KIOThreadTest::FileData*), KIOThreadTest*&, KIOThreadTest::FileData*&) /usr/include/c++/13/bits/invoke.h:96
    #36 0x238c11 in std::invoke_result<bool (KIOThreadTest::*&)(KIOThreadTest::FileData*), KIOThreadTest*&, KIOThreadTest::FileData*&>::type std::invoke<bool (KIOThreadTest::*&)(KIOThreadTest::FileData*), KIOThreadTest*&, KIOThreadTest::FileData*&>(bool (KIOThreadTest::*&)(KIOThreadTest::FileData*), KIOThreadTest*&, KIOThreadTest::FileData*&) /usr/include/c++/13/functional:113
    #37 0x23876a in QtConcurrent::StoredFunctionCall<bool (KIOThreadTest::*)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*>::runFunctor()::{lambda(bool (KIOThreadTest::*)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*)#1}::operator()(bool (KIOThreadTest::*)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*) const /usr/include/qt6/QtConcurrent/qtconcurrentstoredfunctioncall.h:116
    #38 0x239213 in bool std::__invoke_impl<bool, QtConcurrent::StoredFunctionCall<bool (KIOThreadTest::*)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*>::runFunctor()::{lambda(bool (KIOThreadTest::* const&)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*)#1}, bool (KIOThreadTest::*)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*>(std::__invoke_other, QtConcurrent::StoredFunctionCall<bool (KIOThreadTest::*)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*>::runFunctor()::{lambda(bool (KIOThreadTest::* const&)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*)#1}, bool (KIOThreadTest::*&&)(KIOThreadTest::FileData*), KIOThreadTest*&&, KIOThreadTest::FileData*&&) /usr/include/c++/13/bits/invoke.h:61
    #39 0x238e4f in std::__invoke_result<QtConcurrent::StoredFunctionCall<bool (KIOThreadTest::*)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*>::runFunctor()::{lambda(bool (KIOThreadTest::* const&)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*)#1}, bool (KIOThreadTest::*)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*>::type std::__invoke<QtConcurrent::StoredFunctionCall<bool (KIOThreadTest::*)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*>::runFunctor()::{lambda(bool (KIOThreadTest::* const&)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*)#1}, bool (KIOThreadTest::*)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*>(QtConcurrent::StoredFunctionCall<bool (KIOThreadTest::*)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*>::runFunctor()::{lambda(bool (KIOThreadTest::* const&)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*)#1}, bool (KIOThreadTest::*&&)(KIOThreadTest::FileData*), KIOThreadTest*&&, KIOThreadTest::FileData*&&) /usr/include/c++/13/bits/invoke.h:96
    #40 0x2388c9 in decltype(auto) std::__apply_impl<QtConcurrent::StoredFunctionCall<bool (KIOThreadTest::*)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*>::runFunctor()::{lambda(bool (KIOThreadTest::* const&)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*)#1}, std::tuple<bool (KIOThreadTest::*)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*>, 0ul, 1ul, 2ul>(QtConcurrent::StoredFunctionCall<bool (KIOThreadTest::*)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*>::runFunctor()::{lambda(bool (KIOThreadTest::* const&)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*)#1}, std::tuple<bool (KIOThreadTest::*)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*>&&, std::integer_sequence<unsigned long, 0ul, 1ul, 2ul>) /usr/include/c++/13/tuple:2302
    #41 0x238958 in decltype(auto) std::apply<QtConcurrent::StoredFunctionCall<bool (KIOThreadTest::*)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*>::runFunctor()::{lambda(bool (KIOThreadTest::* const&)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*)#1}, std::tuple<bool (KIOThreadTest::*)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*> >(QtConcurrent::StoredFunctionCall<bool (KIOThreadTest::*)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*>::runFunctor()::{lambda(bool (KIOThreadTest::* const&)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*)#1}, std::tuple<bool (KIOThreadTest::*)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*>&&) /usr/include/c++/13/tuple:2313
    #42 0x238a68 in QtConcurrent::StoredFunctionCall<bool (KIOThreadTest::*)(KIOThreadTest::FileData*), KIOThreadTest*, KIOThreadTest::FileData*>::runFunctor() /usr/include/qt6/QtConcurrent/qtconcurrentstoredfunctioncall.h:122
    #43 0x238628 in QtConcurrent::RunFunctionTaskBase<bool>::run() /usr/include/qt6/QtConcurrent/qtconcurrentrunbase.h:83
    #44 0x7f30b9ccda64  (/lib64/libQt6Core.so.6+0x2f3a64) (BuildId: b381724dca6ded0e900824321c27b29af70a08b1)
    #45 0x7f30b9cc6e58  (/lib64/libQt6Core.so.6+0x2ece58) (BuildId: b381724dca6ded0e900824321c27b29af70a08b1)
    #46 0x7f30bfcd3975  (/lib64/libasan.so.8+0x62975) (BuildId: 1827a4c72065a9f25ba519b25166029eebbf519f)
    #47 0x7f30b960fbb1 in start_thread (/lib64/libc.so.6+0x92bb1) (BuildId: 96b8eb5a4407af753cc31c18e7c116279f2eab1f)
    #48 0x7f30b969100b in clone3 (/lib64/libc.so.6+0x11400b) (BuildId: 96b8eb5a4407af753cc31c18e7c116279f2eab1f)
0x5040000107d0 is located 0 bytes inside of 40-byte region [0x5040000107d0,0x5040000107f8)
freed by thread T7 (Thread (pooled)) here:
    #0 0x7f30bfd6b388  (/lib64/libasan.so.8+0xfa388) (BuildId: 1827a4c72065a9f25ba519b25166029eebbf519f)
    #1 0x7f30bb94dd80 in QArrayDataPointer<QString>::~QArrayDataPointer() /usr/include/qt6/QtCore/qarraydatapointer.h:110
    #2 0x7f30bb955659 in QArrayDataPointer<QString>::operator=(QArrayDataPointer<QString>&&) /usr/include/qt6/QtCore/qarraydatapointer.h:84
    #3 0x7f30bb94b486 in QList<QString>::operator=(QList<QString>&&) /usr/include/qt6/QtCore/qlist.h:70
    #4 0x7f30bb930cff in KConfig::mainConfigName() /builds/frameworks/kconfig/src/core/kconfig.cpp:592
    #5 0x7f30bba26f9b in KSharedConfig::openConfig(QString const&, QFlags<KConfig::OpenFlag>, QStandardPaths::StandardLocation) /builds/frameworks/kconfig/src/core/ksharedconfig.cpp:73
    #6 0x7f30bed31110 in KIO::WorkerConfigPrivate::readGlobalConfig() /builds/frameworks/kio/src/core/workerconfig.cpp:63
    #7 0x7f30bed32d5a in KIO::WorkerConfig::WorkerConfig() /builds/frameworks/kio/src/core/workerconfig.cpp:154
    #8 0x7f30bed34b61 in KIO::WorkerConfigSingleton::WorkerConfigSingleton() /builds/frameworks/kio/src/core/workerconfig.cpp:124
    #9 0x7f30bed34ccf in KIO::WorkerConfigSingleton* KIO::perThreadGlobalStatic<KIO::WorkerConfigSingleton>() /builds/frameworks/kio/src/core/workerconfig.cpp:135
    #10 0x7f30bed32c0e in KIO::_workerConfigSelf() /builds/frameworks/kio/src/core/workerconfig.cpp:143
    #11 0x7f30bed32c44 in KIO::WorkerConfig::self() /builds/frameworks/kio/src/core/workerconfig.cpp:148
    #12 0x7f30beab378a in KIO::SchedulerPrivate::metaDataFor(QString const&, QList<QString> const&, QUrl const&) /builds/frameworks/kio/src/core/scheduler.cpp:773
    #13 0x7f30beab4dca in KIO::SchedulerPrivate::setupWorker(KIO::Worker*, QUrl const&, QString const&, QList<QString> const&, bool, KIO::MetaData const*) /builds/frameworks/kio/src/core/scheduler.cpp:802
    #14 0x7f30beab00d5 in KIO::ProtoQueue::startAJob() /builds/frameworks/kio/src/core/scheduler.cpp:556
    #15 0x7f30beaf8f9b in QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (KIO::ProtoQueue::*)()>::call(void (KIO::ProtoQueue::*)(), KIO::ProtoQueue*, void**) /usr/include/qt6/QtCore/qobjectdefs_impl.h:145
    #16 0x7f30beaf0c8f in void QtPrivate::FunctionPointer<void (KIO::ProtoQueue::*)()>::call<QtPrivate::List<>, void>(void (KIO::ProtoQueue::*)(), KIO::ProtoQueue*, void**) /usr/include/qt6/QtCore/qobjectdefs_impl.h:182
    #17 0x7f30beae5557 in QtPrivate::QCallableObject<void (KIO::ProtoQueue::*)(), QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) /usr/include/qt6/QtCore/qobjectdefs_impl.h:553
    #18 0x7f30b9bc2422  (/lib64/libQt6Core.so.6+0x1e8422) (BuildId: b381724dca6ded0e900824321c27b29af70a08b1)
    #19 0x7f30b9bc6af9 in QTimer::timeout(QTimer::QPrivateSignal) (/lib64/libQt6Core.so.6+0x1ecaf9) (BuildId: b381724dca6ded0e900824321c27b29af70a08b1)
    #20 0x7f30b9b68ffe in QCoreApplication::notifyInternal2(QObject*, QEvent*) (/lib64/libQt6Core.so.6+0x18effe) (BuildId: b381724dca6ded0e900824321c27b29af70a08b1)
    #21 0x100000000  (<unknown module>)
previously allocated by thread T6 (Thread (pooled)) here:
    #0 0x7f30bfd6c6e7 in malloc (/lib64/libasan.so.8+0xfb6e7) (BuildId: 1827a4c72065a9f25ba519b25166029eebbf519f)
    #1 0x7f30b9c5b303 in QArrayData::allocate(QArrayData**, long long, long long, long long, QArrayData::AllocationOption) (/lib64/libQt6Core.so.6+0x281303) (BuildId: b381724dca6ded0e900824321c27b29af70a08b1)
Thread T6 (Thread (pooled)) created by T0 here:
    #0 0x7f30bfd64601 in pthread_create (/lib64/libasan.so.8+0xf3601) (BuildId: 1827a4c72065a9f25ba519b25166029eebbf519f)
    #1 0x7f30b9cc280e in QThread::start(QThread::Priority) (/lib64/libQt6Core.so.6+0x2e880e) (BuildId: b381724dca6ded0e900824321c27b29af70a08b1)
    #2 0x7f30b9e26edf  (/lib64/libQt6Core.so.6+0x44cedf) (BuildId: b381724dca6ded0e900824321c27b29af70a08b1)
Thread T7 (Thread (pooled)) created by T0 here:
    #0 0x7f30bfd64601 in pthread_create (/lib64/libasan.so.8+0xf3601) (BuildId: 1827a4c72065a9f25ba519b25166029eebbf519f)
    #1 0x7f30b9cc280e in QThread::start(QThread::Priority) (/lib64/libQt6Core.so.6+0x2e880e) (BuildId: b381724dca6ded0e900824321c27b29af70a08b1)
    #2 0x7f30b9e26edf  (/lib64/libQt6Core.so.6+0x44cedf) (BuildId: b381724dca6ded0e900824321c27b29af70a08b1)

Merge request reports