diff options
author | Yara Hassan <yaraabdullatif@google.com> | 2020-06-17 17:45:30 +0100 |
---|---|---|
committer | Yara Hassan <yaraabdullatif@google.com> | 2020-06-19 15:01:45 +0100 |
commit | be678673b3e381c2957374aa8717027e4b89607a (patch) | |
tree | 0fe50791b69477db69a3af5462dfc9bb0b9553da | |
parent | 4add155920047750977340d2930bdf08fb9bef74 (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.java | 45 |
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, |