From 2dd109d2385e555491f58741db78a4ebb0dcbafa Mon Sep 17 00:00:00 2001 From: Tony Mak Date: Thu, 4 May 2017 11:42:31 +0100 Subject: [PATCH] Add null checking and exception handling in selectBackupTransportAsync Bug: 37304539 Test: bit FrameworksServicesTests:com.android.server.backup.TrampolineTest Change-Id: I01ffa25bfca6ca743220ee7277c2a6473c055bf1 --- .../com/android/server/backup/Trampoline.java | 8 ++++- .../android/server/backup/TrampolineTest.java | 34 ++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/services/backup/java/com/android/server/backup/Trampoline.java b/services/backup/java/com/android/server/backup/Trampoline.java index 1e56e95fbb904..9e7a29e036fc2 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 @@ public class Trampoline extends IBackupManager.Stub { 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 4c53915c79e2c..27ef9d791f4c6 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.File; 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; @@ -599,6 +598,39 @@ public class TrampolineTest { assertEquals(BackupManager.ERROR_BACKUP_NOT_ALLOWED, (int) errorCode); } + @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);