Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9b74cc7 authored by Michal Karpinski's avatar Michal Karpinski
Browse files

[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
parent 78ec67a2
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -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;
    }