From 377f56294efe3f563b6d841854862f2e38a21cfa Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 29 Oct 2024 12:48:21 +0100 Subject: [PATCH] Android: Fix crash on reloadPackages The reloadPackages() deletes old packages, while the internal pointers to these packages are still stored inside the AndroidSdkModel. Later, sdkManagerCommand() executes in a blocking way a process with EventLoopMode::On, causing the model view to repaint and take invalid data from the AndroidSdkModel. The fix is to delete the packages after the nested event loop is finished. Fixes: QTCREATORBUG-31920 Change-Id: Id7e41f7d43ed299329974925c3dc246c4ffbf260 Reviewed-by: Assam Boudjelthia --- src/plugins/android/androidsdkmanager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/android/androidsdkmanager.cpp b/src/plugins/android/androidsdkmanager.cpp index e5f2be4a7d1..b0cfa4bfdcb 100644 --- a/src/plugins/android/androidsdkmanager.cpp +++ b/src/plugins/android/androidsdkmanager.cpp @@ -532,8 +532,6 @@ void AndroidSdkManagerPrivate::reloadSdkPackages() spinner.reset(new Spinner(SpinnerSize::Medium, m_spinnerTarget)); spinner->show(); } - qDeleteAll(m_allPackages); - m_allPackages.clear(); lastSdkManagerPath = AndroidConfig::sdkManagerToolPath(); m_packageListingSuccessful = false; @@ -548,6 +546,8 @@ void AndroidSdkManagerPrivate::reloadSdkPackages() QStringList args({"--list", "--verbose"}); args << AndroidConfig::sdkManagerToolArgs(); m_packageListingSuccessful = sdkManagerCommand(args, &packageListing); + qDeleteAll(m_allPackages); // Must be done after the blocking command execution. See QTCREATORBUG-31920. + m_allPackages.clear(); if (m_packageListingSuccessful) { SdkManagerOutputParser parser(m_allPackages); parser.parsePackageListing(packageListing);