From 12f783d6c6155a65a87511e200206a81798aa2ed Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Tue, 24 Feb 2015 17:27:09 -0800 Subject: Don't crash when backup timeout races with agent completion There's a narrow window of time in which an agent reporting that its operation has completed races with timeouts such that we wind up handling the completion callback just after certain fundamental state has been reset. Detect this race and proceed gracefully instead of crashing. Bug 19498669 Change-Id: I5a475527db1a55a8e567366ddfb10112e427682e --- .../com/android/server/backup/BackupManagerService.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'services/backup') diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index 4d7ebed..acf4d39 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -2778,7 +2778,22 @@ public class BackupManagerService { @Override public void operationComplete() { - // Okay, the agent successfully reported back to us! + // The agent reported back to us! + + if (mBackupData == null) { + // This callback was racing with our timeout, so we've cleaned up the + // agent state already and are on to the next thing. We have nothing + // further to do here: agent state having been cleared means that we've + // initiated the appropriate next operation. + final String pkg = (mCurrentPackage != null) + ? mCurrentPackage.packageName : "[none]"; + if (DEBUG) { + Slog.i(TAG, "Callback after agent teardown: " + pkg); + } + addBackupTrace("late opComplete; curPkg = " + pkg); + return; + } + final String pkgName = mCurrentPackage.packageName; final long filepos = mBackupDataName.length(); FileDescriptor fd = mBackupData.getFileDescriptor(); -- cgit v1.1