Bug 470321

Summary: Apps periodically crash in Solid::DeviceNotifier::deviceAdded() when making devices available
Product: [Frameworks and Libraries] frameworks-solid Reporter: Alexey Min <alexey.min>
Component: generalAssignee: Unassigned bugs <unassigned-bugs-null>
Status: RESOLVED FIXED    
Severity: crash CC: anandshaurya, christoph, dnd.united, dolphin-bugs-null, equeim, giecrilj, kdedev, kdelibs-bugs-null, lukas, nate, nicolas.fella, RyougaLolakieIV, sergiu, yedaya.ka
Priority: HI Keywords: drkonqi
Version First Reported In: 5.106.0   
Target Milestone: ---   
Platform: Gentoo Packages   
OS: Linux   
See Also: https://bugs.kde.org/show_bug.cgi?id=513089
Latest Commit: Version Fixed/Implemented In: 6.23
Sentry Crash Report:

Description Alexey Min 2023-05-27 02:57:16 UTC
Application: dolphin (22.12.3)

Qt Version: 5.15.9
Frameworks Version: 5.106.0
Operating System: Linux 6.3.2-gentoo x86_64
Windowing System: X11
Distribution: "Gentoo Linux"
DrKonqi: 5.27.5 [KCrashBackend]

-- Information about the crash:
I was running postmarketOS bootstrap tool (pmbootstrap) and it creates filesystem images by creating loop devices, mounting them, formatting, copying files and umounting. I suppose bug is somewhere in solid in device enumeration?

The reporter is unsure if this crash is reproducible.

-- Backtrace:
Application: Dolphin (dolphin), signal: Segmentation fault
Content of s_kcrashErrorMessage: std::unique_ptr<char []> = {get() = 0x0}
[KCrash Handler]
#6  std::__atomic_base<int>::load (__m=std::memory_order_relaxed, this=0x21) at /usr/lib/gcc/x86_64-pc-linux-gnu/12/include/g++-v12/bits/atomic_base.h:486
#7  QAtomicOps<int>::loadRelaxed<int> (_q_value=<error reading variable: Cannot access memory at address 0x21>) at /usr/include/qt5/QtCore/qatomic_cxx11.h:239
#8  QBasicAtomicInteger<int>::loadRelaxed (this=0x21) at /usr/include/qt5/QtCore/qbasicatomic.h:107
#9  QtPrivate::RefCount::ref (this=0x21) at /usr/include/qt5/QtCore/qrefcount.h:55
#10 QString::QString (other=..., this=this@entry=0x7ffcc8da6b80) at /usr/include/qt5/QtCore/qstring.h:1094
#11 Solid::DevicePrivate::udi (this=0x557814437890) at /usr/src/debug/kde-frameworks/solid-5.106.0/solid-5.106.0/src/solid/devices/frontend/device_p.h:32
#12 Solid::Device::udi (this=this@entry=0x55781364a230) at /usr/src/debug/kde-frameworks/solid-5.106.0/solid-5.106.0/src/solid/devices/frontend/device.cpp:70
#13 0x00007f32751830a8 in KFilePlacesItem::updateDeviceInfo (this=this@entry=0x55781364a200, udi=...) at /usr/src/debug/kde-frameworks/kio-5.106.0/kio-5.106.0/src/filewidgets/kfileplacesitem.cpp:461
#14 0x00007f327518394d in KFilePlacesItem::setBookmark (this=this@entry=0x55781364a200, bookmark=...) at /usr/src/debug/kde-frameworks/kio-5.106.0/kio-5.106.0/src/filewidgets/kfileplacesitem.cpp:161
#15 0x00007f327518d460 in KFilePlacesModelPrivate::reloadBookmarks (this=this@entry=0x557812aea470) at /usr/src/debug/kde-frameworks/kio-5.106.0/kio-5.106.0/src/filewidgets/kfileplacesmodel.cpp:842
#16 0x00007f327518eca4 in KFilePlacesModelPrivate::deviceAdded (udi=..., this=0x557812aea470) at /usr/src/debug/kde-frameworks/kio-5.106.0/kio-5.106.0/src/filewidgets/kfileplacesmodel.cpp:783
#17 operator() (device=..., __closure=<optimized out>) at /usr/src/debug/kde-frameworks/kio-5.106.0/kio-5.106.0/src/filewidgets/kfileplacesmodel.cpp:761
#18 QtPrivate::FunctorCall<QtPrivate::IndexesList<0>, QtPrivate::List<const QString&>, void, KFilePlacesModelPrivate::initDeviceList()::<lambda(const QString&)> >::call (arg=<optimized out>, f=...) at /usr/include/qt5/QtCore/qobjectdefs_impl.h:146
#19 QtPrivate::Functor<KFilePlacesModelPrivate::initDeviceList()::<lambda(const QString&)>, 1>::call<QtPrivate::List<QString const&>, void> (arg=<optimized out>, f=...) at /usr/include/qt5/QtCore/qobjectdefs_impl.h:256
#20 QtPrivate::QFunctorSlotObject<KFilePlacesModelPrivate::initDeviceList()::<lambda(const QString&)>, 1, QtPrivate::List<const QString&>, void>::impl(int, QtPrivate::QSlotObjectBase *, QObject *, void **, bool *) (which=<optimized out>, this_=<optimized out>, r=<optimized out>, a=<optimized out>, ret=<optimized out>) at /usr/include/qt5/QtCore/qobjectdefs_impl.h:443
#21 0x00007f32731adaa3 in QtPrivate::QSlotObjectBase::call (this=0x557812ac8610, r=0x557812abb260, a=0x7ffcc8da6eb0) at /usr/src/debug/dev-qt/qtcore-5.15.9/qtbase-everywhere-src-5.15.9/include/QtCore/../../src/corelib/kernel/qobjectdefs_impl.h:398
#22 0x00007f32731ef3b7 in doActivate<false> (sender=0x557812af4ce0, signal_index=3, argv=0x7ffcc8da6eb0) at /usr/src/debug/dev-qt/qtcore-5.15.9/qtbase-everywhere-src-5.15.9/src/corelib/kernel/qobject.cpp:3923
#23 0x00007f32731e8a7d in QMetaObject::activate (sender=0x557812af4ce0, m=0x7f3274b90ca0 <Solid::DeviceNotifier::staticMetaObject>, local_signal_index=0, argv=0x7ffcc8da6eb0) at /usr/src/debug/dev-qt/qtcore-5.15.9/qtbase-everywhere-src-5.15.9/src/corelib/kernel/qobject.cpp:3983
#24 0x00007f3274af9af2 in Solid::DeviceNotifier::deviceAdded (this=<optimized out>, _t1=...) at /usr/src/debug/kde-frameworks/solid-5.106.0/solid-5.106.0_build/src/solid/KF5Solid_autogen/include/moc_devicenotifier.cpp:144
#25 0x00007f32731ef465 in doActivate<false> (sender=0x557812b17090, signal_index=3, argv=0x7ffcc8da7030) at /usr/src/debug/dev-qt/qtcore-5.15.9/qtbase-everywhere-src-5.15.9/src/corelib/kernel/qobject.cpp:3935
#26 0x00007f32731e8a7d in QMetaObject::activate (sender=0x557812b17090, m=0x7f3274b90480 <Solid::Ifaces::DeviceManager::staticMetaObject>, local_signal_index=0, argv=0x7ffcc8da7030) at /usr/src/debug/dev-qt/qtcore-5.15.9/qtbase-everywhere-src-5.15.9/src/corelib/kernel/qobject.cpp:3983
#27 0x00007f3274ae6e22 in Solid::Ifaces::DeviceManager::deviceAdded (this=this@entry=0x557812b17090, _t1=...) at /usr/src/debug/kde-frameworks/solid-5.106.0/solid-5.106.0_build/src/solid/KF5Solid_autogen/3PYKXLVNWF/moc_devicemanager.cpp:144
#28 0x00007f3274b269f9 in Solid::Backends::UDisks2::Manager::slotInterfacesAdded (this=0x557812b17090, object_path=..., interfaces_and_properties=...) at /usr/src/debug/kde-frameworks/solid-5.106.0/solid-5.106.0/src/solid/devices/backends/udisks2/udisksmanager.cpp:210
#29 0x00007f32731ef465 in doActivate<false> (sender=0x557812b170a8, signal_index=3, argv=0x7ffcc8da72b0) at /usr/src/debug/dev-qt/qtcore-5.15.9/qtbase-everywhere-src-5.15.9/src/corelib/kernel/qobject.cpp:3935
#30 0x00007f32731e8a7d in QMetaObject::activate (sender=0x557812b170a8, m=0x7f3274b90980 <OrgFreedesktopDBusObjectManagerInterface::staticMetaObject>, local_signal_index=0, argv=0x7ffcc8da72b0) at /usr/src/debug/dev-qt/qtcore-5.15.9/qtbase-everywhere-src-5.15.9/src/corelib/kernel/qobject.cpp:3983
#31 0x00007f3274aed884 in OrgFreedesktopDBusObjectManagerInterface::InterfacesAdded (_t2=..., _t1=..., this=<optimized out>) at /usr/src/debug/kde-frameworks/solid-5.106.0/solid-5.106.0_build/src/solid/KF5Solid_autogen/W35TJJ7QHF/moc_manager.cpp:182
#32 OrgFreedesktopDBusObjectManagerInterface::qt_static_metacall (_o=_o@entry=0x557812b170a8, _c=_c@entry=QMetaObject::InvokeMetaMethod, _id=_id@entry=0, _a=_a@entry=0x7ffcc8da7400) at /usr/src/debug/kde-frameworks/solid-5.106.0/solid-5.106.0_build/src/solid/KF5Solid_autogen/W35TJJ7QHF/moc_manager.cpp:93
#33 0x00007f3274af2b03 in OrgFreedesktopDBusObjectManagerInterface::qt_metacall (this=0x557812b170a8, _c=QMetaObject::InvokeMetaMethod, _id=0, _a=0x7ffcc8da7400) at /usr/src/debug/kde-frameworks/solid-5.106.0/solid-5.106.0_build/src/solid/KF5Solid_autogen/W35TJJ7QHF/moc_manager.cpp:168
#34 0x00007f32742927fb in QDBusConnectionPrivate::deliverCall (this=<optimized out>, object=<optimized out>, msg=..., metaTypes=..., slotIdx=<optimized out>) at /usr/src/debug/dev-qt/qtdbus-5.15.9/qtbase-everywhere-src-5.15.9/include/QtCore/../../src/corelib/tools/qvarlengtharray.h:189
#35 0x00007f32731e20c5 in QObject::event (this=0x557812b170a8, e=0x7f326804e310) at /usr/src/debug/dev-qt/qtcore-5.15.9/qtbase-everywhere-src-5.15.9/src/corelib/kernel/qobject.cpp:1347
#36 0x00007f3273cd002e in QApplicationPrivate::notify_helper (this=<optimized out>, receiver=0x557812b170a8, e=0x7f326804e310) at /usr/src/debug/dev-qt/qtwidgets-5.15.9/qtbase-everywhere-src-5.15.9/src/widgets/kernel/qapplication.cpp:3640
#37 0x00007f327319c411 in QCoreApplication::notifyInternal2 (receiver=0x557812b170a8, event=0x7f326804e310) at /usr/src/debug/dev-qt/qtcore-5.15.9/qtbase-everywhere-src-5.15.9/src/corelib/kernel/qcoreapplication.cpp:1064
#38 0x00007f327319ce1c in QCoreApplication::sendEvent (receiver=0x557812b170a8, event=0x7f326804e310) at /usr/src/debug/dev-qt/qtcore-5.15.9/qtbase-everywhere-src-5.15.9/src/corelib/kernel/qcoreapplication.cpp:1462
#39 0x00007f327319dae7 in QCoreApplicationPrivate::sendPostedEvents (receiver=0x0, event_type=0, data=0x557812907d40) at /usr/src/debug/dev-qt/qtcore-5.15.9/qtbase-everywhere-src-5.15.9/src/corelib/kernel/qcoreapplication.cpp:1821
#40 0x00007f327319d49a in QCoreApplication::sendPostedEvents (receiver=0x0, event_type=0) at /usr/src/debug/dev-qt/qtcore-5.15.9/qtbase-everywhere-src-5.15.9/src/corelib/kernel/qcoreapplication.cpp:1680
#41 0x00007f3273230f31 in postEventSourceDispatch (s=0x557812a48ac0) at /usr/src/debug/dev-qt/qtcore-5.15.9/qtbase-everywhere-src-5.15.9/src/corelib/kernel/qeventdispatcher_glib.cpp:277
#42 0x00007f3270da032c in g_main_dispatch (context=0x7f3268000ee0) at ../glib-2.76.2/glib/gmain.c:3460
#43 0x00007f3270da137a in g_main_context_dispatch (context=0x7f3268000ee0) at ../glib-2.76.2/glib/gmain.c:4200
#44 0x00007f3270da157c in g_main_context_iterate (context=0x7f3268000ee0, block=1, dispatch=1, self=0x557812a517a0) at ../glib-2.76.2/glib/gmain.c:4276
#45 0x00007f3270da1654 in g_main_context_iteration (context=0x7f3268000ee0, may_block=1) at ../glib-2.76.2/glib/gmain.c:4343
#46 0x00007f32732316ad in QEventDispatcherGlib::processEvents (this=0x557812a50760, flags=...) at /usr/src/debug/dev-qt/qtcore-5.15.9/qtbase-everywhere-src-5.15.9/src/corelib/kernel/qeventdispatcher_glib.cpp:423
#47 0x00007f3273198e15 in QEventLoop::processEvents (this=0x7ffcc8da7a20, flags=...) at /usr/src/debug/dev-qt/qtcore-5.15.9/qtbase-everywhere-src-5.15.9/src/corelib/kernel/qeventloop.cpp:142
#48 0x00007f327319912b in QEventLoop::exec (this=0x7ffcc8da7a20, flags=...) at /usr/src/debug/dev-qt/qtcore-5.15.9/qtbase-everywhere-src-5.15.9/src/corelib/kernel/qeventloop.cpp:235
#49 0x00007f327319cc59 in QCoreApplication::exec () at /usr/src/debug/dev-qt/qtcore-5.15.9/qtbase-everywhere-src-5.15.9/src/corelib/kernel/qcoreapplication.cpp:1375
#50 0x00007f32736a05ac in QGuiApplication::exec () at /usr/src/debug/dev-qt/qtgui-5.15.9/qtbase-everywhere-src-5.15.9/src/gui/kernel/qguiapplication.cpp:1870
#51 0x00007f3273ccffa5 in QApplication::exec () at /usr/src/debug/dev-qt/qtwidgets-5.15.9/qtbase-everywhere-src-5.15.9/src/widgets/kernel/qapplication.cpp:2832
#52 0x00005578121d1142 in main (argc=<optimized out>, argv=<optimized out>) at /usr/src/debug/kde-apps/dolphin-22.12.3/dolphin-22.12.3/src/main.cpp:258
[Inferior 1 (process 663288) detached]

The reporter indicates this bug may be a duplicate of or related to bug 460402, bug 469110.

Reported using DrKonqi
Comment 1 Christoph Cullmann 2023-09-23 07:41:56 UTC
*** Bug 474794 has been marked as a duplicate of this bug. ***
Comment 2 cwo 2024-08-02 16:22:46 UTC
*** Bug 479885 has been marked as a duplicate of this bug. ***
Comment 3 Nate Graham 2025-12-08 22:00:59 UTC
*** Bug 440427 has been marked as a duplicate of this bug. ***
Comment 4 Nate Graham 2025-12-08 22:01:04 UTC
*** Bug 510246 has been marked as a duplicate of this bug. ***
Comment 5 Nate Graham 2025-12-08 22:01:26 UTC
*** Bug 512226 has been marked as a duplicate of this bug. ***
Comment 6 Nate Graham 2026-01-05 21:21:33 UTC
*** Bug 513968 has been marked as a duplicate of this bug. ***
Comment 7 Nicolas Fella 2026-01-21 10:53:45 UTC
Git commit 1348d32ca17e6b026c8925778939ea24ed63eaad by Nicolas Fella.
Committed on 21/01/2026 at 10:48.
Pushed by nicolasfella into branch 'master'.

Use delete instead of deleteLater() when DevicePrivate refcount drops to 0

When the last interface of a udisk device is removed we emit deviceRemoved(),
which results in setBackendObject(nullptr). There we deref the deviceprivate
and delete if necessary.

By using deleteLater() the deletion is delayed, which can cause issues
where the Device accesses an already deleted DevicePrivate.

By using delete instead we make sure that the DevicePrivate is immediately
deleted and removed from m_devicesMap

Remove an assert in DeviceManager since dev may already be deleted now
Related: bug 513508, bug 494224, bug 513089, bug 513921

M  +1    -1    src/solid/devices/frontend/device.cpp
M  +0    -1    src/solid/devices/frontend/devicemanager.cpp

https://invent.kde.org/frameworks/solid/-/commit/1348d32ca17e6b026c8925778939ea24ed63eaad
Comment 8 TraceyC 2026-02-09 21:59:34 UTC
*** Bug 515767 has been marked as a duplicate of this bug. ***