diff options
| author | 2017-09-18 14:15:56 +0100 | |
|---|---|---|
| committer | 2017-09-18 14:18:17 +0100 | |
| commit | f9b74cc7ef0e3fc6b95e4a988361b46e90bdfd5d (patch) | |
| tree | 483c7fcdc296265ea9886197af6122d060fecdfc | |
| parent | 78ec67a264b6b25b3353514c4f9ce5ea1b9fb1f3 (diff) | |
[RefactoredBMS] Ensure backup doesn't reuse ack tokens nearby in time
This CL replicates both ag/2551800 and ag/2613950 in RefactoredBMS.
Test: runtest -p com.android.server.backup frameworks-services
Bug: 37973765
Change-Id: I5e42dee67d587adabbfb81de03f3205d92a46add
| -rw-r--r-- | services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java b/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java index dd99b023c6aa..f15866113931 100644 --- a/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java @@ -150,6 +150,7 @@ import java.util.Queue; import java.util.Random; import java.util.Set; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicInteger; public class RefactoredBackupManagerService implements BackupManagerServiceInterface { @@ -626,6 +627,7 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter private final SparseArray<Operation> mCurrentOperations = new SparseArray<>(); private final Object mCurrentOpLock = new Object(); private final Random mTokenGenerator = new Random(); + final AtomicInteger mNextToken = new AtomicInteger(); private final SparseArray<AdbParams> mAdbBackupRestoreConfirmations = new SparseArray<>(); @@ -665,15 +667,15 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter @GuardedBy("mQueueLock") private ArrayList<FullBackupEntry> mFullBackupQueue; - // Utility: build a new random integer token + // Utility: build a new random integer token. The low bits are the ordinal of the + // operation for near-time uniqueness, and the upper bits are random for app- + // side unpredictability. @Override public int generateRandomIntegerToken() { - int token; - do { - synchronized (mTokenGenerator) { - token = mTokenGenerator.nextInt(); - } - } while (token < 0); + int token = mTokenGenerator.nextInt(); + if (token < 0) token = -token; + token &= ~0xFF; + token |= (mNextToken.incrementAndGet() & 0xFF); return token; } |