SUMMARY Solid's b2d5036acf5f8edf8ec859b1b46b06e5d5e12767 tag: v5.245.0 suffers from multiple memory leaks in the caching of its udisks2 backends STEPS TO REPRODUCE 1. compile solid with asan/lsan 2. run it against udisks2 3. call Solid::Device::listFromType OBSERVED RESULT ``` ==218628==ERROR: LeakSanitizer: detected memory leaks Indirect leak of 2024 byte(s) in 23 object(s) allocated from: #0 0x7f07c3ee2002 in operator new(unsigned long) /usr/src/debug/gcc/gcc/libsanitizer/asan/asan_new_delete.cpp:95 #1 0x7f073ea563ee in std::__new_allocator<std::_Rb_tree_node<std::pair<QString const, QVariant> > >::allocate(unsigned long, void const*) /usr/include/c++/13.2.1/bits/new_allocator.h:147 #2 0x7f073ea53f19 in std::allocator<std::_Rb_tree_node<std::pair<QString const, QVariant> > >::allocate(unsigned long) /usr/include/c++/13.2.1/bits/allocator.h:198 #3 0x7f073ea53f19 in std::allocator_traits<std::allocator<std::_Rb_tree_node<std::pair<QString const, QVariant> > > >::allocate(std::allocator<std::_Rb_tree_node<std::pair<QString const, QVariant> > >&, unsigned long) /usr/include/c++/13.2.1/bits/alloc_traits.h:482 #4 0x7f073ea53f19 in std::_Rb_tree<QString, std::pair<QString const, QVariant>, std::_Select1st<std::pair<QString const, QVariant> >, std::less<QString>, std::allocator<std::pair<QString const, QVariant> > >::_M_get_node() /usr/include/c++/13.2.1/bits/stl_tree.h:563 #5 0x7f073ea81226 in std::_Rb_tree_node<std::pair<QString const, QVariant> >* std::_Rb_tree<QString, std::pair<QString const, QVariant>, std::_Select1st<std::pair<QString const, QVariant> >, std::less<QString>, std::allocator<std::pair<QString const, QVariant> > >::_M_create_node<std::piecewise_construct_t const&, std::tuple<QString const&>, std::tuple<QVariant const&> >(std::piecewise_construct_t const&, std::tuple<QString const&>&&, std::tuple<QVariant const&>&&) /usr/include/c++/13.2.1/bits/stl_tree.h:613 #6 0x7f073ea7f80e in std::_Rb_tree<QString, std::pair<QString const, QVariant>, std::_Select1st<std::pair<QString const, QVariant> >, std::less<QString>, std::allocator<std::pair<QString const, QVariant> > >::_Auto_node::_Auto_node<std::piecewise_construct_t const&, std::tuple<QString const&>, std::tuple<QVariant const&> >(std::_Rb_tree<QString, std::pair<QString const, QVariant>, std::_Select1st<std::pair<QString const, QVariant> >, std::less<QString>, std::allocator<std::pair<QString const, QVariant> > >&, std::piecewise_construct_t const&, std::tuple<QString const&>&&, std::tuple<QVariant const&>&&) /usr/include/c++/13.2.1/bits/stl_tree.h:1637 #7 0x7f073ea7b4fd in std::_Rb_tree_iterator<std::pair<QString const, QVariant> > std::_Rb_tree<QString, std::pair<QString const, QVariant>, std::_Select1st<std::pair<QString const, QVariant> >, std::less<QString>, std::allocator<std::pair<QString const, QVariant> > >::_M_emplace_hint_unique<std::piecewise_construct_t const&, std::tuple<QString const&>, std::tuple<QVariant const&> >(std::_Rb_tree_const_iterator<std::pair<QString const, QVariant> >, std::piecewise_construct_t const&, std::tuple<QString const&>&&, std::tuple<QVariant const&>&&) /usr/include/c++/13.2.1/bits/stl_tree.h:2462 #8 0x7f073ea76566 in std::_Rb_tree_iterator<std::pair<QString const, QVariant> > std::map<QString, QVariant, std::less<QString>, std::allocator<std::pair<QString const, QVariant> > >::emplace_hint<std::piecewise_construct_t const&, std::tuple<QString const&>, std::tuple<QVariant const&> >(std::_Rb_tree_const_iterator<std::pair<QString const, QVariant> >, std::piecewise_construct_t const&, std::tuple<QString const&>&&, std::tuple<QVariant const&>&&) /usr/include/c++/13.2.1/bits/stl_map.h:640 #9 0x7f073ea70eca in std::pair<std::_Rb_tree_iterator<std::pair<QString const, QVariant> >, bool> std::map<QString, QVariant, std::less<QString>, std::allocator<std::pair<QString const, QVariant> > >::insert_or_assign<QVariant const&>(QString const&, QVariant const&) /usr/include/c++/13.2.1/bits/stl_map.h:973 #10 0x7f073ea6d189 in QMap<QString, QVariant>::insert(QString const&, QVariant const&) /home/milian/Qt/6.5.2/gcc_64/include/QtCore/qmap.h:692 #11 0x7f073ebd56ec in Solid::Backends::UDisks2::DeviceBackend::cacheProperty(QString const&, QVariant const&) const solid6/src/solid/devices/backends/udisks2/udisksdevicebackend.cpp:266 #12 0x7f073ebd1e83 in Solid::Backends::UDisks2::DeviceBackend::allProperties() const solid6/src/solid/devices/backends/udisks2/udisksdevicebackend.cpp:141 #13 0x7f073ebd3164 in Solid::Backends::UDisks2::DeviceBackend::checkCache(QString const&) const solid6/src/solid/devices/backends/udisks2/udisksdevicebackend.cpp:172 #14 0x7f073ebd0d63 in Solid::Backends::UDisks2::DeviceBackend::prop(QString const&) const solid6/src/solid/devices/backends/udisks2/udisksdevicebackend.cpp:114 #15 0x7f073eba69ad in Solid::Backends::UDisks2::Device::prop(QString const&) const solid6/src/solid/devices/backends/udisks2/udisksdevice.cpp:118 #16 0x7f073ebbd25d in Solid::Backends::UDisks2::Device::drivePath() const solid6/src/solid/devices/backends/udisks2/udisksdevice.cpp:884 #17 0x7f073ebbb88d in Solid::Backends::UDisks2::Device::mightBeOpticalDisc() const solid6/src/solid/devices/backends/udisks2/udisksdevice.cpp:833 #18 0x7f073eb290e6 in Solid::Backends::UDisks2::Manager::introspect(QString const&, bool) solid6/src/solid/devices/backends/udisks2/udisksmanager.cpp:143 #19 0x7f073eb27cf7 in Solid::Backends::UDisks2::Manager::allDevices() solid6/src/solid/devices/backends/udisks2/udisksmanager.cpp:119 #20 0x7f073eb2d1ad in Solid::Backends::UDisks2::Manager::deviceCache() solid6/src/solid/devices/backends/udisks2/udisksmanager.cpp:282 #21 0x7f073eb26ec6 in Solid::Backends::UDisks2::Manager::devicesFromQuery(QString const&, Solid::DeviceInterface::Type) solid6/src/solid/devices/backends/udisks2/udisksmanager.cpp:90 #22 0x7f073e8f8605 in Solid::Device::listFromType(Solid::DeviceInterface::Type const&, QString const&) solid6/src/solid/devices/frontend/devicemanager.cpp:107 Indirect leak of 176 byte(s) in 2 object(s) allocated from: #0 0x7f07c3ee2002 in operator new(unsigned long) /usr/src/debug/gcc/gcc/libsanitizer/asan/asan_new_delete.cpp:95 #1 0x7f073ea563ee in std::__new_allocator<std::_Rb_tree_node<std::pair<QString const, QVariant> > >::allocate(unsigned long, void const*) /usr/include/c++/13.2.1/bits/new_allocator.h:147 #2 0x7f073ea53f19 in std::allocator<std::_Rb_tree_node<std::pair<QString const, QVariant> > >::allocate(unsigned long) /usr/include/c++/13.2.1/bits/allocator.h:198 #3 0x7f073ea53f19 in std::allocator_traits<std::allocator<std::_Rb_tree_node<std::pair<QString const, QVariant> > > >::allocate(std::allocator<std::_Rb_tree_node<std::pair<QString const, QVariant> > >&, unsigned long) /usr/include/c++/13.2.1/bits/alloc_traits.h:482 #4 0x7f073ea53f19 in std::_Rb_tree<QString, std::pair<QString const, QVariant>, std::_Select1st<std::pair<QString const, QVariant> >, std::less<QString>, std::allocator<std::pair<QString const, QVariant> > >::_M_get_node() /usr/include/c++/13.2.1/bits/stl_tree.h:563 #5 0x7f073ea81226 in std::_Rb_tree_node<std::pair<QString const, QVariant> >* std::_Rb_tree<QString, std::pair<QString const, QVariant>, std::_Select1st<std::pair<QString const, QVariant> >, std::less<QString>, std::allocator<std::pair<QString const, QVariant> > >::_M_create_node<std::piecewise_construct_t const&, std::tuple<QString const&>, std::tuple<QVariant const&> >(std::piecewise_construct_t const&, std::tuple<QString const&>&&, std::tuple<QVariant const&>&&) /usr/include/c++/13.2.1/bits/stl_tree.h:613 #6 0x7f073ea7f80e in std::_Rb_tree<QString, std::pair<QString const, QVariant>, std::_Select1st<std::pair<QString const, QVariant> >, std::less<QString>, std::allocator<std::pair<QString const, QVariant> > >::_Auto_node::_Auto_node<std::piecewise_construct_t const&, std::tuple<QString const&>, std::tuple<QVariant const&> >(std::_Rb_tree<QString, std::pair<QString const, QVariant>, std::_Select1st<std::pair<QString const, QVariant> >, std::less<QString>, std::allocator<std::pair<QString const, QVariant> > >&, std::piecewise_construct_t const&, std::tuple<QString const&>&&, std::tuple<QVariant const&>&&) /usr/include/c++/13.2.1/bits/stl_tree.h:1637 #7 0x7f073ea7b4fd in std::_Rb_tree_iterator<std::pair<QString const, QVariant> > std::_Rb_tree<QString, std::pair<QString const, QVariant>, std::_Select1st<std::pair<QString const, QVariant> >, std::less<QString>, std::allocator<std::pair<QString const, QVariant> > >::_M_emplace_hint_unique<std::piecewise_construct_t const&, std::tuple<QString const&>, std::tuple<QVariant const&> >(std::_Rb_tree_const_iterator<std::pair<QString const, QVariant> >, std::piecewise_construct_t const&, std::tuple<QString const&>&&, std::tuple<QVariant const&>&&) /usr/include/c++/13.2.1/bits/stl_tree.h:2462 #8 0x7f073ea76566 in std::_Rb_tree_iterator<std::pair<QString const, QVariant> > std::map<QString, QVariant, std::less<QString>, std::allocator<std::pair<QString const, QVariant> > >::emplace_hint<std::piecewise_construct_t const&, std::tuple<QString const&>, std::tuple<QVariant const&> >(std::_Rb_tree_const_iterator<std::pair<QString const, QVariant> >, std::piecewise_construct_t const&, std::tuple<QString const&>&&, std::tuple<QVariant const&>&&) /usr/include/c++/13.2.1/bits/stl_map.h:640 #9 0x7f073ea70eca in std::pair<std::_Rb_tree_iterator<std::pair<QString const, QVariant> >, bool> std::map<QString, QVariant, std::less<QString>, std::allocator<std::pair<QString const, QVariant> > >::insert_or_assign<QVariant const&>(QString const&, QVariant const&) /usr/include/c++/13.2.1/bits/stl_map.h:973 #10 0x7f073ea6d189 in QMap<QString, QVariant>::insert(QString const&, QVariant const&) /home/milian/Qt/6.5.2/gcc_64/include/QtCore/qmap.h:692 #11 0x7f073ebd5614 in Solid::Backends::UDisks2::DeviceBackend::cacheProperty(QString const&, QVariant const&) const solid6/src/solid/devices/backends/udisks2/udisksdevicebackend.cpp:264 #12 0x7f073ebd1e83 in Solid::Backends::UDisks2::DeviceBackend::allProperties() const solid6/src/solid/devices/backends/udisks2/udisksdevicebackend.cpp:141 #13 0x7f073ebd3164 in Solid::Backends::UDisks2::DeviceBackend::checkCache(QString const&) const solid6/src/solid/devices/backends/udisks2/udisksdevicebackend.cpp:172 #14 0x7f073ebd0d63 in Solid::Backends::UDisks2::DeviceBackend::prop(QString const&) const solid6/src/solid/devices/backends/udisks2/udisksdevicebackend.cpp:114 #15 0x7f073eba69ad in Solid::Backends::UDisks2::Device::prop(QString const&) const solid6/src/solid/devices/backends/udisks2/udisksdevice.cpp:118 #16 0x7f073ebbd25d in Solid::Backends::UDisks2::Device::drivePath() const solid6/src/solid/devices/backends/udisks2/udisksdevice.cpp:884 #17 0x7f073ebbb88d in Solid::Backends::UDisks2::Device::mightBeOpticalDisc() const solid6/src/solid/devices/backends/udisks2/udisksdevice.cpp:833 #18 0x7f073eb290e6 in Solid::Backends::UDisks2::Manager::introspect(QString const&, bool) solid6/src/solid/devices/backends/udisks2/udisksmanager.cpp:143 #19 0x7f073eb27cf7 in Solid::Backends::UDisks2::Manager::allDevices() solid6/src/solid/devices/backends/udisks2/udisksmanager.cpp:119 #20 0x7f073eb2d1ad in Solid::Backends::UDisks2::Manager::deviceCache() solid6/src/solid/devices/backends/udisks2/udisksmanager.cpp:282 #21 0x7f073eb26ec6 in Solid::Backends::UDisks2::Manager::devicesFromQuery(QString const&, Solid::DeviceInterface::Type) solid6/src/solid/devices/backends/udisks2/udisksmanager.cpp:90 #22 0x7f073e8f8605 in Solid::Device::listFromType(Solid::DeviceInterface::Type const&, QString const&) solid6/src/solid/devices/frontend/devicemanager.cpp:107 Indirect leak of 120 byte(s) in 1 object(s) allocated from: #0 0x7f07c3ee2002 in operator new(unsigned long) /usr/src/debug/gcc/gcc/libsanitizer/asan/asan_new_delete.cpp:95 #1 0x7f0745599b44 in QObject::QObject(QObject*) /home/qt/work/qt/qtbase/src/corelib/kernel/qobject.cpp:911 #2 0x7f073ebce7a1 in Solid::Backends::UDisks2::DeviceBackend::backendForUDI(QString const&, bool) solid6/src/solid/devices/backends/udisks2/udisksdevicebackend.cpp:32 #3 0x7f073eba5c6e in Solid::Backends::UDisks2::Device::Device(QString const&) solid6/src/solid/devices/backends/udisks2/udisksdevice.cpp:92 #4 0x7f073eb29023 in Solid::Backends::UDisks2::Manager::introspect(QString const&, bool) solid6/src/solid/devices/backends/udisks2/udisksmanager.cpp:142 #5 0x7f073eb27cf7 in Solid::Backends::UDisks2::Manager::allDevices() solid6/src/solid/devices/backends/udisks2/udisksmanager.cpp:119 #6 0x7f073eb2d1ad in Solid::Backends::UDisks2::Manager::deviceCache() solid6/src/solid/devices/backends/udisks2/udisksmanager.cpp:282 #7 0x7f073eb26ec6 in Solid::Backends::UDisks2::Manager::devicesFromQuery(QString const&, Solid::DeviceInterface::Type) solid6/src/solid/devices/backends/udisks2/udisksmanager.cpp:90 #8 0x7f073e8f8605 in Solid::Device::listFromType(Solid::DeviceInterface::Type const&, QString const&) solid6/src/solid/devices/frontend/devicemanager.cpp:107 Indirect leak of 72 byte(s) in 1 object(s) allocated from: #0 0x7f07c3ee2002 in operator new(unsigned long) /usr/src/debug/gcc/gcc/libsanitizer/asan/asan_new_delete.cpp:95 #1 0x7f073ebce767 in Solid::Backends::UDisks2::DeviceBackend::backendForUDI(QString const&, bool) solid6/src/solid/devices/backends/udisks2/udisksdevicebackend.cpp:32 #2 0x7f073eba5c6e in Solid::Backends::UDisks2::Device::Device(QString const&) solid6/src/solid/devices/backends/udisks2/udisksdevice.cpp:92 #3 0x7f073eb29023 in Solid::Backends::UDisks2::Manager::introspect(QString const&, bool) solid6/src/solid/devices/backends/udisks2/udisksmanager.cpp:142 #4 0x7f073eb27cf7 in Solid::Backends::UDisks2::Manager::allDevices() solid6/src/solid/devices/backends/udisks2/udisksmanager.cpp:119 #5 0x7f073eb2d1ad in Solid::Backends::UDisks2::Manager::deviceCache() solid6/src/solid/devices/backends/udisks2/udisksmanager.cpp:282 #6 0x7f073eb26ec6 in Solid::Backends::UDisks2::Manager::devicesFromQuery(QString const&, Solid::DeviceInterface::Type) solid6/src/solid/devices/backends/udisks2/udisksmanager.cpp:90 #7 0x7f073e8f8605 in Solid::Device::listFromType(Solid::DeviceInterface::Type const&, QString const&) solid6/src/solid/devices/frontend/devicemanager.cpp:107 Indirect leak of 56 byte(s) in 1 object(s) allocated from: #0 0x7f07c3ee2002 in operator new(unsigned long) /usr/src/debug/gcc/gcc/libsanitizer/asan/asan_new_delete.cpp:95 #1 0x7f073ea48c76 in QMap<QString, QVariant>::detach() /home/milian/Qt/6.5.2/gcc_64/include/QtCore/qmap.h:275 #2 0x7f073ea6d04b in QMap<QString, QVariant>::insert(QString const&, QVariant const&) /home/milian/Qt/6.5.2/gcc_64/include/QtCore/qmap.h:691 #3 0x7f073ebd56ec in Solid::Backends::UDisks2::DeviceBackend::cacheProperty(QString const&, QVariant const&) const solid6/src/solid/devices/backends/udisks2/udisksdevicebackend.cpp:266 #4 0x7f073ebd1e83 in Solid::Backends::UDisks2::DeviceBackend::allProperties() const solid6/src/solid/devices/backends/udisks2/udisksdevicebackend.cpp:141 #5 0x7f073ebd3164 in Solid::Backends::UDisks2::DeviceBackend::checkCache(QString const&) const solid6/src/solid/devices/backends/udisks2/udisksdevicebackend.cpp:172 #6 0x7f073ebd0d63 in Solid::Backends::UDisks2::DeviceBackend::prop(QString const&) const solid6/src/solid/devices/backends/udisks2/udisksdevicebackend.cpp:114 #7 0x7f073eba69ad in Solid::Backends::UDisks2::Device::prop(QString const&) const solid6/src/solid/devices/backends/udisks2/udisksdevice.cpp:118 #8 0x7f073ebbd25d in Solid::Backends::UDisks2::Device::drivePath() const solid6/src/solid/devices/backends/udisks2/udisksdevice.cpp:884 #9 0x7f073ebbb88d in Solid::Backends::UDisks2::Device::mightBeOpticalDisc() const solid6/src/solid/devices/backends/udisks2/udisksdevice.cpp:833 #10 0x7f073eb290e6 in Solid::Backends::UDisks2::Manager::introspect(QString const&, bool) solid6/src/solid/devices/backends/udisks2/udisksmanager.cpp:143 #11 0x7f073eb27cf7 in Solid::Backends::UDisks2::Manager::allDevices() solid6/src/solid/devices/backends/udisks2/udisksmanager.cpp:119 #12 0x7f073eb2d1ad in Solid::Backends::UDisks2::Manager::deviceCache() solid6/src/solid/devices/backends/udisks2/udisksmanager.cpp:282 #13 0x7f073eb26ec6 in Solid::Backends::UDisks2::Manager::devicesFromQuery(QString const&, Solid::DeviceInterface::Type) solid6/src/solid/devices/backends/udisks2/udisksmanager.cpp:90 #14 0x7f073e8f8605 in Solid::Device::listFromType(Solid::DeviceInterface::Type const&, QString const&) solid6/src/solid/devices/frontend/devicemanager.cpp:107 ``` EXPECTED RESULT no leaks