D5321: [Notifications Applet] Don't crash when containment() disappears
David Edmundson
noreply at phabricator.kde.org
Mon Apr 10 22:08:22 UTC 2017
davidedmundson accepted this revision.
davidedmundson added a comment.
This revision is now accepted and ready to land.
Heh, finally found the bug.
I was a bit wrong.
QObject::destroyed() is emitted before we delete the children.
But that still doesn't explain everything, the containment won't get deleted till after the child applet is deleted; so why would containment() be null?
We know it's not deleted yet, so it's not really "gone" like your comment says,
The issue is that containment() is a qobject_cast recursive search of parents. (for some reason)
qobject_cast calls metaobject() which is virtual. Calling a virtual method during an objects destructor can result in unexpected behaviour.
Our parent is still valid, but we've called Containment::~Containment, Applet::~Applet and we're currently in QObject::~QObject, so when we call a method on a base class it doesn't get dynamically dispatched as it should.
So when we call parent()->metaObject() we now get the metaobject for QObject not the metaobject of Containment.
This means the qobject_cast fails, and that's why Applet::containment() is null even though the containment is still there.
REPOSITORY
R120 Plasma Workspace
REVISION DETAIL
https://phabricator.kde.org/D5321
To: broulik, #plasma, davidedmundson
Cc: davidedmundson, plasma-devel, progwolff, lesliezhai, ali-mohamed, jensreuterberg, abetts, sebas, apol
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/plasma-devel/attachments/20170410/ca4718fc/attachment-0001.html>
More information about the Plasma-devel
mailing list