fix for KConfigPrivate::groupList (kconfig.cpp)

Tommaso Massimi tmassimi at gmail.com
Fri Dec 29 09:53:45 GMT 2023


hi,

running plasma-systemmonitor with valgring a lot of problems are declared,
I'm trying to check them out.

I'm not sure if this is the best way to communicate with the development
team,
so I'm writing this mail also to have some indication about that. Please cc
me, I'm not subscribed to the list

part of valgrind output (neon unstable development 25-12-2023)

==70026== Invalid read of size 16
==70026==    at 0x668FAF7: ??? (in
/usr/lib/x86_64-linux-gnu/libQt6Core.so.6.6.1)
==70026==    by 0x575CB05: calculateHash<QStringView> (qhash.h:57)
==70026==    by 0x575CB05:
QHashPrivate::Data<QHashPrivate::Node<QStringView, QHashDummyValue>
>::findBucket(QStringView const&) const [clone .isra.0] (qhash.h:683)
==70026==    by 0x575FF43: findOrInsert (qhash.h:718)
==70026==    by 0x575FF43: QHash<QStringView, QHashDummyValue>::iterator
QHash<QStringView,
QHashDummyValue>::emplace_helper<QHashDummyValue>(QStringView&&,
QHashDummyValue&&) [clone .isra.0] (qhash.h:1335)
==70026==    by 0x5761E89: emplace<QHashDummyValue> (qhash.h:1321)
==70026==    by 0x5761E89: insert (qset.h:158)
==70026==    by 0x5761E89: operator() (kconfig.cpp:325)
==70026==    by 0x5761E89:
forEachEntryWhoseGroupStartsWith<KConfigPrivate::groupList(const QString&)
const::<lambda(KEntryMapConstIterator)> > (kconfigdata_p.h:252)
==70026==    by 0x5761E89: KConfigPrivate::groupList(QString const&) const
(kconfig.cpp:320)
==70026==    by 0x5771089: KConfigGroup::groupList() const
(kconfiggroup.cpp:1147)
==70026==    by 0x1B94F929: PageDataObject::load(KConfigBase const&,
QString const&) (PageDataObject.cpp:235)
==70026==    by 0x1B95705E: PagesModel::componentComplete()
(PagesModel.cpp:99)
==70026==    by 0x53C1876:
QQmlObjectCreator::finalize(QQmlInstantiationInterrupt&) (in
/usr/lib/x86_64-linux-gnu/libQt6Qml.so.6.6.1)
==70026==    by 0x54489AC:
QQmlComponentPrivate::complete(QQmlEnginePrivate*,
QQmlComponentPrivate::ConstructionState*) (in
/usr/lib/x86_64-linux-gnu/libQt6Qml.so.6.6.1)
==70026==    by 0x5448CAB: QQmlComponentPrivate::completeCreate() (in
/usr/lib/x86_64-linux-gnu/libQt6Qml.so.6.6.1)
==70026==    by 0x544AC88:
QQmlComponentPrivate::createWithProperties(QObject*, QMap<QString,
QVariant> const&, QQmlContext*, QQmlComponentPrivate::CreateBehavior) (in
/usr/lib/x86_64-linux-gnu/libQt6Qml.so.6.6.1)
==70026==    by 0x54400DF:
QQmlApplicationEnginePrivate::finishLoad(QQmlComponent*) (in
/usr/lib/x86_64-linux-gnu/libQt6Qml.so.6.6.1)
==70026==  Address 0xcd3c40a is 26 bytes inside a block of size 38 alloc'd
==70026==    at 0x4848899: malloc (in
/usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==70026==    by 0x65A5677: QArrayData::allocate(QArrayData**, long long,
long long, long long, QArrayData::AllocationOption) (in
/usr/lib/x86_64-linux-gnu/libQt6Core.so.6.6.1)
==70026==    by 0x657DCFE: QString::QString(long long, Qt::Initialization)
(in /usr/lib/x86_64-linux-gnu/libQt6Core.so.6.6.1)
==70026==    by 0x6589D97: QString::fromUtf8(QByteArrayView) (in
/usr/lib/x86_64-linux-gnu/libQt6Core.so.6.6.1)
==70026==    by 0x577DA4E: fromUtf8<> (qstring.h:588)
==70026==    by 0x577DA4E: KConfigIniBackend::parseConfig(QByteArray
const&, KEntryMap&, QFlags<KConfigBackend::ParseOption>, bool)
(kconfigini.cpp:157)
==70026==    by 0x5760C68: KConfigPrivate::parseConfigFiles()
(kconfig.cpp:798)
==70026==    by 0x5784E81: KSharedConfig::KSharedConfig(QString const&,
QFlags<KConfig::OpenFlag>, QStandardPaths::StandardLocation)
(ksharedconfig.cpp:123)
==70026==    by 0x57854E0: KSharedConfig::openConfig(QString const&,
QFlags<KConfig::OpenFlag>, QStandardPaths::StandardLocation)
(ksharedconfig.cpp:88)
==70026==    by 0x1B957006: PagesModel::componentComplete()
(PagesModel.cpp:96)
==70026==    by 0x53C1876:
QQmlObjectCreator::finalize(QQmlInstantiationInterrupt&) (in
/usr/lib/x86_64-linux-gnu/libQt6Qml.so.6.6.1)
==70026==    by 0x54489AC:
QQmlComponentPrivate::complete(QQmlEnginePrivate*,
QQmlComponentPrivate::ConstructionState*) (in
/usr/lib/x86_64-linux-gnu/libQt6Qml.so.6.6.1)
==70026==    by 0x5448CAB: QQmlComponentPrivate::completeCreate() (in
/usr/lib/x86_64-linux-gnu/libQt6Qml.so.6.6.1)



this problem is generated in this function:


==70026==    by 0x5761E89: KConfigPrivate::groupList(QString const&) const
(kconfig.cpp:320)

i.e.

QStringList KConfigPrivate::groupList(const QString &groupName) const
{
    const QString theGroup = groupName + QLatin1Char('\x1d');
    QSet<QStringView> groups;

    entryMap.forEachEntryWhoseGroupStartsWith(theGroup, [&theGroup,
&groups](KEntryMapConstIterator entryMapIt) {
        if (isNonDeletedKey(entryMapIt)) {
            const QString &entryGroup = entryMapIt->first.mGroup;
            const auto subgroupStartPos = theGroup.size();
            const auto subgroupEndPos = findFirstGroupEndPos(entryGroup,
subgroupStartPos);
            groups.insert(QStringView(entryGroup).mid(subgroupStartPos,
subgroupEndPos - subgroupStartPos));
        }
    });

    return stringListFromStringViewCollection(groups);
}



in this line the function .mid (deprecated in QStringView) is creating a
temporary object which is inserted to groups,

            groups.insert(QStringView(entryGroup).mid(subgroupStartPos,
subgroupEndPos - subgroupStartPos));


groups is declared as :
QSet<QStringView> groups;

QStringView doesn't own data, it is like a wrapper/reference to a qstring.
so the value inserted on group is like a reference to a temporary qstring;
but the qstring will be deleted while the QStringView will remain in group
pointing to garbage


==================

this is my correction, no more complaints from valgrind about this case



tom1 at tom-neon:~/kde/src/kconfig/src/core$ git diff kconfig.cpp
diff --git a/src/core/kconfig.cpp b/src/core/kconfig.cpp
index b467e17e..31be6845 100644
--- a/src/core/kconfig.cpp
+++ b/src/core/kconfig.cpp
@@ -315,18 +315,19 @@ QStringList KConfig::groupList() const
 QStringList KConfigPrivate::groupList(const QString &groupName) const
 {
     const QString theGroup = groupName + QLatin1Char('\x1d');
-    QSet<QStringView> groups;
+    QSet<QString> groups;

     entryMap.forEachEntryWhoseGroupStartsWith(theGroup, [&theGroup,
&groups](KEntryMapConstIterator entryMapIt) {
         if (isNonDeletedKey(entryMapIt)) {
             const QString &entryGroup = entryMapIt->first.mGroup;
             const auto subgroupStartPos = theGroup.size();
             const auto subgroupEndPos = findFirstGroupEndPos(entryGroup,
subgroupStartPos);
-            groups.insert(QStringView(entryGroup).mid(subgroupStartPos,
subgroupEndPos - subgroupStartPos));
+            groups.insert(entryGroup.mid(subgroupStartPos, subgroupEndPos
- subgroupStartPos));
         }
     });

-    return stringListFromStringViewCollection(groups);
+    QStringList list(groups.begin(), groups.end());
+    return list;
 }
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/kde-devel/attachments/20231229/46e8fdf5/attachment.htm>


More information about the kde-devel mailing list