summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Michal Karpinski <mkarpinski@google.com> 2017-09-18 14:15:56 +0100
committer Michal Karpinski <mkarpinski@google.com> 2017-09-18 14:18:17 +0100
commitf9b74cc7ef0e3fc6b95e4a988361b46e90bdfd5d (patch)
tree483c7fcdc296265ea9886197af6122d060fecdfc
parent78ec67a264b6b25b3353514c4f9ce5ea1b9fb1f3 (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.java16
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;
}