fix for KConfigPrivate::groupList (kconfig.cpp)

Friedrich W. H. Kossebau kossebau at kde.org
Fri Dec 29 10:22:27 GMT 2023


Am Freitag, 29. Dezember 2023, 10:53:45 CET schrieb Tommaso Massimi:
> 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

QStringView::mid() returns a QStringView though, no? Which still points to the 
raw data of the original QString I would assume? Which "temporary qstring" 
would you think of here?

Caught this email while going out-of-door, so just a first-minute reply, will 
have a look later CET today (being the one who touched that code last).

Cheers
Friedrich




More information about the kde-devel mailing list