Commit b11d4d2b authored by Fergus Dall's avatar Fergus Dall Committed by Commit Bot

Discard invalid iterators in StartQueuedOperation that could cause crashes

Bug: 1015341
Change-Id: I711702f6e7ba4f5881bc227ab04f695e494c47fa
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1868771
Auto-Submit: Fergus Dall <sidereal@google.com>
Commit-Queue: Nicholas Verne <nverne@chromium.org>
Reviewed-by: default avatarNicholas Verne <nverne@chromium.org>
Cr-Commit-Position: refs/heads/master@{#707705}
parent a35c28a4
...@@ -554,10 +554,14 @@ void CrostiniPackageService::StartQueuedOperation( ...@@ -554,10 +554,14 @@ void CrostiniPackageService::StartQueuedOperation(
PackageOperationStatus::SUCCEEDED, 100); PackageOperationStatus::SUCCEEDED, 100);
} }
// Clean up memory. // As recursive calls to StartQueuedOperation might delete |uninstall_queue|
if (uninstall_queue.empty()) { // and invalidate |uninstall_queue_iter| we must look it up again.
uninstall_queue_iter = queued_uninstalls_.find(container_id);
if (uninstall_queue_iter != queued_uninstalls_.end() &&
uninstall_queue_iter->second.empty()) {
// Clean up memory.
queued_uninstalls_.erase(uninstall_queue_iter); queued_uninstalls_.erase(uninstall_queue_iter);
// Invalidates uninstall_queue. // Invalidates |uninstall_queue_iter|.
} }
return; return;
} }
...@@ -590,10 +594,15 @@ void CrostiniPackageService::StartQueuedOperation( ...@@ -590,10 +594,15 @@ void CrostiniPackageService::StartQueuedOperation(
weak_ptr_factory_.GetWeakPtr(), vm_name, container_name, weak_ptr_factory_.GetWeakPtr(), vm_name, container_name,
std::move(callback))); std::move(callback)));
// Clean up memory. // InstallLinuxPackage shouldn't be able to recursively call this method,
if (install_queue.empty()) { // but as future proofing consider |install_queue_iter| to be invalidated
// anyway.
install_queue_iter = queued_installs_.find(container_id);
if (install_queue_iter != queued_installs_.end() &&
install_queue_iter->second.empty()) {
// Clean up memory.
queued_installs_.erase(install_queue_iter); queued_installs_.erase(install_queue_iter);
// Invalidates install_queue. // Invalidates |install_queue_iter|.
} }
return; return;
} }
......
...@@ -904,6 +904,8 @@ TEST_F(CrostiniPackageServiceTest, SecondUninstallStartsWhenFirstFails) { ...@@ -904,6 +904,8 @@ TEST_F(CrostiniPackageServiceTest, SecondUninstallStartsWhenFirstFails) {
} }
TEST_F(CrostiniPackageServiceTest, DuplicateUninstallSucceeds) { TEST_F(CrostiniPackageServiceTest, DuplicateUninstallSucceeds) {
// Use three uninstalls as a regression test for crbug.com/1015341
service_->QueueUninstallApplication(kDefaultAppId);
service_->QueueUninstallApplication(kDefaultAppId); service_->QueueUninstallApplication(kDefaultAppId);
service_->QueueUninstallApplication(kDefaultAppId); service_->QueueUninstallApplication(kDefaultAppId);
...@@ -921,6 +923,7 @@ TEST_F(CrostiniPackageServiceTest, DuplicateUninstallSucceeds) { ...@@ -921,6 +923,7 @@ TEST_F(CrostiniPackageServiceTest, DuplicateUninstallSucceeds) {
Printable(notification_display_service_->GetDisplayedNotificationsForType( Printable(notification_display_service_->GetDisplayedNotificationsForType(
NotificationHandler::Type::TRANSIENT)), NotificationHandler::Type::TRANSIENT)),
UnorderedElementsAre(IsUninstallSuccessNotification(DEFAULT_APP), UnorderedElementsAre(IsUninstallSuccessNotification(DEFAULT_APP),
IsUninstallSuccessNotification(DEFAULT_APP),
IsUninstallSuccessNotification(DEFAULT_APP))); IsUninstallSuccessNotification(DEFAULT_APP)));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment