From 0277db478d0e24b23b1637c0323842bf3e185d87 Mon Sep 17 00:00:00 2001 From: Shreyas Basarge Date: Thu, 16 Feb 2017 00:56:59 +0000 Subject: [PATCH] Better iteration over mCurrentOperations in cancelBackups handleCancel was being called on an operation while we are iterating over all operations. This can cause issues if handleCancel modifies the array containing all operations. Test: Run cancelBackup GTS tests. Change-Id: If3fbe7b5d9e61aa870f8f6e0dd1654e735c0c5b8 --- .../com/android/server/backup/BackupManagerService.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index 13e6ae04d8585..8fbc52032df51 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -2400,14 +2400,19 @@ public class BackupManagerService { } final long oldToken = Binder.clearCallingIdentity(); try { + List operationsToCancel = new ArrayList<>(); synchronized (mCurrentOpLock) { for (int i = 0; i < mCurrentOperations.size(); i++) { Operation op = mCurrentOperations.valueAt(i); int token = mCurrentOperations.keyAt(i); if (op.type == OP_TYPE_BACKUP) { - handleCancel(token, true /* cancelAll */); + operationsToCancel.add(token); } } + + for (Integer token : operationsToCancel) { + handleCancel(token, true /* cancelAll */); + } } // We don't want the backup jobs to kick in any time soon.