force-finish canberra notifications on close()
Summary: `KNotification::close()` causes the manager to close the plugin for the notification and after that KNotification will call deleteLater() on itself. In the canberra variant of NotifyByAudio we handled this by calling ca_context_cancel to abort playback of the audio. This ultimately would still cause a finishCallback once the playback actually cancelled. The callback does arrive in an undefined amount of loop cycles later though. Put together this allowed for timing issues where deleteLater would run before the finishCallback arrived, giving finishCallback the risk of accessing a KNotification object past its lifetime and segfaulting. To prevent this from happening we'll finishNotification in the plugin's close(). This drops the notification out of the mapping hashes and tells the manager that we are done. finishCallback now returns immediately if it cannot find a mapping for a notification (i.e. it was close()d already). CHANGELOG: Fixed a crash caused by bad lifetime management of canberra-based audio notification BUG: 398695 Test Plan: added qdebugs. without patch close() and thus deleteLater() happens before finishCallback() but the callback still does its thing. with patch finishCallback is noop. Reviewers: broulik, jtamate Reviewed By: broulik, jtamate Subscribers: kde-frameworks-devel, jtamate Tags: #frameworks Differential Revision: https://phabricator.kde.org/D15638
parent
5b49ca71
Please register or sign in to comment