From a28b5c51602ccc48f2672274dabda05d3776ccd9 Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Thu, 16 Oct 2014 13:44:00 -0700 Subject: [PATCH] Eliminate race condition around backup completion + resumption Ensure that the callback always sees the current-operation state in sync with the various other bits of internal backup-operation state. Previously only the current-operation state was managed inside the critical section; this resulted in a slim race window where a callback could see an ongoing operation as still valid, but after the internal state on which that operation depended had already been cleared. Bug 17931760 Change-Id: Ia032668e7a9d22f1029c57fc98db9e86484d5719 --- .../java/com/android/server/backup/BackupManagerService.java | 5 ++++- 1 file changed, 4 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 60801fb965b76..fea1a7ae6829f 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -2855,9 +2855,12 @@ public class BackupManagerService extends IBackupManager.Stub { try { if (mSavedState != null) mSavedState.close(); } catch (IOException e) {} try { if (mBackupData != null) mBackupData.close(); } catch (IOException e) {} try { if (mNewState != null) mNewState.close(); } catch (IOException e) {} - mSavedState = mBackupData = mNewState = null; synchronized (mCurrentOpLock) { + // Current-operation callback handling requires the validity of these various + // bits of internal state as an invariant of the operation still being live. + // This means we make sure to clear all of the state in unison inside the lock. mCurrentOperations.clear(); + mSavedState = mBackupData = mNewState = null; } // If this was a pseudopackage there's no associated Activity Manager state