summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYara Hassan <yaraabdullatif@google.com>2020-06-17 17:45:30 +0100
committerYara Hassan <yaraabdullatif@google.com>2020-06-19 15:01:45 +0100
commitbe678673b3e381c2957374aa8717027e4b89607a (patch)
tree0fe50791b69477db69a3af5462dfc9bb0b9553da
parent4add155920047750977340d2930bdf08fb9bef74 (diff)
Catch RemoteExceptions in DataShareCallbackDelegate
Catch the RemoteExceptions thrown in DataShareCallback's accept() and reject() methods, as throwing an exception could result in the ContentCaptureService crashing. Bug: 159213080 Fixes: 159213080 Test: ran cts tests Change-Id: I4ce8f15c835fba665a0657c7b3ed898f4e091b19
-rw-r--r--services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java45
1 files changed, 36 insertions, 9 deletions
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
index 4a4b7dd7cc29..ea94ad0b3c20 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
@@ -953,7 +953,7 @@ public final class ContentCaptureManagerService extends
}
@Override
- public void accept(@NonNull IDataShareReadAdapter serviceAdapter) throws RemoteException {
+ public void accept(@NonNull IDataShareReadAdapter serviceAdapter) {
Slog.i(TAG, "Data share request accepted by Content Capture service");
logServiceEvent(CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__ACCEPT_DATA_SHARE_REQUEST);
@@ -961,8 +961,8 @@ public final class ContentCaptureManagerService extends
if (clientPipe == null) {
logServiceEvent(
CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_CLIENT_PIPE_FAIL);
- mClientAdapter.error(ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN);
- serviceAdapter.error(ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN);
+ sendErrorSignal(mClientAdapter, serviceAdapter,
+ ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN);
return;
}
@@ -975,8 +975,8 @@ public final class ContentCaptureManagerService extends
CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_SERVICE_PIPE_FAIL);
bestEffortCloseFileDescriptors(sourceIn, sinkIn);
- mClientAdapter.error(ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN);
- serviceAdapter.error(ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN);
+ sendErrorSignal(mClientAdapter, serviceAdapter,
+ ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN);
return;
}
@@ -985,8 +985,26 @@ public final class ContentCaptureManagerService extends
mParentService.mPackagesWithShareRequests.add(mDataShareRequest.getPackageName());
- mClientAdapter.write(sourceIn);
- serviceAdapter.start(sinkOut);
+ try {
+ mClientAdapter.write(sourceIn);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to call write() the client operation", e);
+ sendErrorSignal(mClientAdapter, serviceAdapter,
+ ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN);
+ logServiceEvent(
+ CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_CLIENT_PIPE_FAIL);
+ return;
+ }
+ try {
+ serviceAdapter.start(sinkOut);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to call start() the service operation", e);
+ sendErrorSignal(mClientAdapter, serviceAdapter,
+ ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN);
+ logServiceEvent(
+ CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_SERVICE_PIPE_FAIL);
+ return;
+ }
// File descriptors received by remote apps will be copies of the current one. Close
// the ones that belong to the system server, so there's only 1 open left for the
@@ -1061,11 +1079,20 @@ public final class ContentCaptureManagerService extends
}
@Override
- public void reject() throws RemoteException {
+ public void reject() {
Slog.i(TAG, "Data share request rejected by Content Capture service");
logServiceEvent(CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__REJECT_DATA_SHARE_REQUEST);
- mClientAdapter.rejected();
+ try {
+ mClientAdapter.rejected();
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Failed to call rejected() the client operation", e);
+ try {
+ mClientAdapter.error(ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN);
+ } catch (RemoteException e2) {
+ Slog.w(TAG, "Failed to call error() the client operation", e2);
+ }
+ }
}
private void enforceDataSharingTtl(ParcelFileDescriptor sourceIn,