Add null checking and exception handling in selectBackupTransportAsync
Bug: 37304539
Test: bit FrameworksServicesTests:com.android.server.backup.TrampolineTest
Change-Id: I01ffa25bfca6ca743220ee7277c2a6473c055bf1
diff --git a/services/backup/java/com/android/server/backup/Trampoline.java b/services/backup/java/com/android/server/backup/Trampoline.java
index 1e56e95..9e7a29e 100644
--- a/services/backup/java/com/android/server/backup/Trampoline.java
+++ b/services/backup/java/com/android/server/backup/Trampoline.java
@@ -357,7 +357,13 @@
if (svc != null) {
svc.selectBackupTransportAsync(transport, listener);
} else {
- listener.onFailure(BackupManager.ERROR_BACKUP_NOT_ALLOWED);
+ if (listener != null) {
+ try {
+ listener.onFailure(BackupManager.ERROR_BACKUP_NOT_ALLOWED);
+ } catch (RemoteException ex) {
+ // ignore
+ }
+ }
}
}
diff --git a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java
index 4c53915..27ef9d7 100644
--- a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java
@@ -56,7 +56,6 @@
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.PrintWriter;
-import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
@@ -600,6 +599,39 @@
}
@Test
+ public void selectBackupTransportAsync_calledBeforeInitialize_ignored_nullListener()
+ throws Exception {
+ mTrampoline.selectBackupTransportAsync(TRANSPORT_COMPONENT_NAME, null);
+ verifyNoMoreInteractions(mBackupManagerServiceMock);
+ // No crash.
+ }
+
+ @Test
+ public void selectBackupTransportAsync_calledBeforeInitialize_ignored_listenerThrowException()
+ throws Exception {
+ mTrampoline.selectBackupTransportAsync(
+ TRANSPORT_COMPONENT_NAME,
+ new ISelectBackupTransportCallback() {
+ @Override
+ public void onSuccess(String transportName) throws RemoteException {
+
+ }
+
+ @Override
+ public void onFailure(int reason) throws RemoteException {
+ throw new RemoteException("Crash");
+ }
+
+ @Override
+ public IBinder asBinder() {
+ return null;
+ }
+ });
+ verifyNoMoreInteractions(mBackupManagerServiceMock);
+ // No crash.
+ }
+
+ @Test
public void selectBackupTransportAsync_forwarded() throws RemoteException {
mTrampoline.initialize(UserHandle.USER_SYSTEM);
mTrampoline.selectBackupTransportAsync(TRANSPORT_COMPONENT_NAME, null);