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 <assam.boudjelthia@qt.io>
This commit is contained in:
Jarek Kobus
2024-10-29 12:48:21 +01:00
parent 96cb78b617
commit 377f56294e

View File

@@ -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);