Skip to content

Commit

Permalink
Catch RemoteExceptions in DataShareCallbackDelegate
Browse files Browse the repository at this point in the history
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
  • Loading branch information
yara11 committed Jun 19, 2020
1 parent 4add155 commit be67867
Showing 1 changed file with 36 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -953,16 +953,16 @@ private static class DataShareCallbackDelegate extends IDataShareCallback.Stub {
}

@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);

Pair<ParcelFileDescriptor, ParcelFileDescriptor> clientPipe = createPipe();
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;
}

Expand All @@ -975,8 +975,8 @@ public void accept(@NonNull IDataShareReadAdapter serviceAdapter) throws RemoteE
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;
}

Expand All @@ -985,8 +985,26 @@ public void accept(@NonNull IDataShareReadAdapter serviceAdapter) throws RemoteE

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
Expand Down Expand Up @@ -1061,11 +1079,20 @@ public void accept(@NonNull IDataShareReadAdapter serviceAdapter) throws RemoteE
}

@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,
Expand Down

0 comments on commit be67867

Please sign in to comment.