KCMultiDialog: Fix crash when clicking OK

Review Request #118639 - Created June 10, 2014 and submitted

Aurélien Gâteau
When one closes KCMultiDialog with OK, QDialog::finished() can be emitted before the clicked() signal of the OK button. This causes the following sequence to happen:

- KCMultiDialogPrivate::_k_dialogClosed
  * deletes the KCModule
    - KCModuleProxyPrivate::_k_moduleDestroyed
      * sets kcm to 0

- KCMultiDialog::slotOkClicked
  - KCMultiDialogPrivate::apply
    - KCModuleProxy::save
      - KCModuleProxyPrivate::realModule
        * notices kcm is 0, so recreates it
        * calls kcm->save()
          - KWinDesktopConfig::save()
            * crashes because it expects kcm->load() to have been called

To avoid this, trigger the cleanup code in closeEvent() rather than when finished() is emitted, as we can be sure closeEvent() is always called *after* the methods connected to the button box signals has executed.

Configuring virtual desktops does not crash anymore
David Edmundson
Aurélien Gâteau
Sebastian Kügler
Aleix Pol Gonzalez
Commit Hook
This review has been submitted with commit cc99fac3af737619ea220ccb7059f0d8f0623efa by Aurélien Gâteau to branch master.
Aurélien Gâteau
Review request changed

Status: Closed (submitted)