From c39f9cc82791d486313f31a08295b42d782f1f0c Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Sat, 2 May 2020 17:11:42 +0200 Subject: [PATCH] SoftwareUpdater: fix crash on exit. Don't delete or Quit() a BWindow, it can do so by itself. Also, do not rebuild a BMessenger everytime we want to message a window, that defeats the purpose. There are still places where the UpdateManager calls functions from the window object directly however, ignoring the fact that the window may have been closed. Fixes #13653. Change-Id: I868e94a07d9617f343332ea00d35ffd92e60ed8e Reviewed-on: https://review.haiku-os.org/c/haiku/+/2552 Reviewed-by: waddlesplash --- src/apps/softwareupdater/UpdateManager.cpp | 28 +++++++++------------- src/apps/softwareupdater/UpdateManager.h | 2 ++ 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/apps/softwareupdater/UpdateManager.cpp b/src/apps/softwareupdater/UpdateManager.cpp index 81824e98f8..aa448cf54c 100644 --- a/src/apps/softwareupdater/UpdateManager.cpp +++ b/src/apps/softwareupdater/UpdateManager.cpp @@ -45,26 +45,20 @@ UpdateManager::UpdateManager(BPackageInstallationLocation location, BPackageManager(location, &fClientInstallationInterface, this), BPackageManager::UserInteractionHandler(), fClientInstallationInterface(), - fStatusWindow(NULL), + fStatusWindow(new SoftwareUpdaterWindow()), + fStatusWindowMessenger(fStatusWindow), + fProblemWindow(NULL), + fProblemWindowMessenger(), fCurrentStep(ACTION_STEP_INIT), fChangesConfirmed(false), fVerbose(verbose) { - fStatusWindow = new SoftwareUpdaterWindow(); _SetCurrentStep(ACTION_STEP_START); } UpdateManager::~UpdateManager() { - if (fStatusWindow != NULL) { - fStatusWindow->Lock(); - fStatusWindow->Quit(); - } - if (fProblemWindow != NULL) { - fProblemWindow->Lock(); - fProblemWindow->Quit(); - } } @@ -92,11 +86,10 @@ update_type UpdateManager::GetUpdateType() { int32 action = USER_SELECTION_NEEDED; - BMessenger messenger(fStatusWindow); - if (messenger.IsValid()) { + if (fStatusWindowMessenger.IsValid()) { BMessage message(kMsgGetUpdateType); BMessage reply; - messenger.SendMessage(&message, &reply); + fStatusWindowMessenger.SendMessage(&message, &reply); reply.FindInt32(kKeyAlertResult, &action); } return (update_type)action; @@ -110,11 +103,10 @@ UpdateManager::CheckRepositories() if (fVerbose) printf("Remote repositories available: %" B_PRId32 "\n", count); if (count == 0) { - BMessenger messenger(fStatusWindow); - if (messenger.IsValid()) { + if (fStatusWindowMessenger.IsValid()) { BMessage message(kMsgNoRepositories); BMessage reply; - messenger.SendMessage(&message, &reply); + fStatusWindowMessenger.SendMessage(&message, &reply); int32 result; reply.FindInt32(kKeyAlertResult, &result); if (result == 1) @@ -159,8 +151,10 @@ UpdateManager::FinalUpdate(const char* header, const char* text) void UpdateManager::HandleProblems() { - if (fProblemWindow == NULL) + if (fProblemWindow == NULL) { fProblemWindow = new ProblemWindow; + fProblemWindowMessenger.SetTo(fProblemWindow); + } ProblemWindow::SolverPackageSet installPackages; ProblemWindow::SolverPackageSet uninstallPackages; diff --git a/src/apps/softwareupdater/UpdateManager.h b/src/apps/softwareupdater/UpdateManager.h index 61e5623de8..36b3fc15f0 100644 --- a/src/apps/softwareupdater/UpdateManager.h +++ b/src/apps/softwareupdater/UpdateManager.h @@ -88,7 +88,9 @@ private: fClientInstallationInterface; SoftwareUpdaterWindow* fStatusWindow; + BMessenger fStatusWindowMessenger; ProblemWindow* fProblemWindow; + BMessenger fProblemWindowMessenger; uint32 fCurrentStep; bool fChangesConfirmed; bool fNewDownloadStarted;