diff options
author | Yara Hassan <yaraabdullatif@google.com> | 2020-05-20 18:31:21 +0100 |
---|---|---|
committer | Ahaan Ugale <augale@google.com> | 2020-05-29 14:36:22 -0700 |
commit | cf146dfa3909cffb169ef30c195109a0c528ff2c (patch) | |
tree | 4ddae72694baf7148e5c1bc2329d2b691cd4deac /services/contentcapture/java | |
parent | dc699fb8cea5f97020152b75641dfcb641e7e96a (diff) |
Handle sender's crash in Data Share API
Implement IBinder.DeathRecipient in DataShareCallbackDelegate to listen
to the client's death and send an error to the CC service.
Test: CTS test
Bug: 157141129
Fixes: 157141129
Change-Id: I30f08f8ed741988ebcf585d74168d4dda03663a8
Diffstat (limited to 'services/contentcapture/java')
-rw-r--r-- | services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java index fcdf3cf6f857..13e5ab451cfc 100644 --- a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java +++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java @@ -930,7 +930,7 @@ public final class ContentCaptureManagerService extends } @Override - public void accept(IDataShareReadAdapter serviceAdapter) throws RemoteException { + public void accept(@NonNull IDataShareReadAdapter serviceAdapter) throws RemoteException { Slog.i(TAG, "Data share request accepted by Content Capture service"); Pair<ParcelFileDescriptor, ParcelFileDescriptor> clientPipe = createPipe(); @@ -967,6 +967,7 @@ public final class ContentCaptureManagerService extends bestEffortCloseFileDescriptors(sourceIn, sinkOut); mParentService.mDataShareExecutor.execute(() -> { + boolean receivedData = false; try (InputStream fis = new ParcelFileDescriptor.AutoCloseInputStream(sinkIn); OutputStream fos = @@ -981,6 +982,8 @@ public final class ContentCaptureManagerService extends } fos.write(byteBuffer, 0 /* offset */, readBytes); + + receivedData = true; } } catch (IOException e) { Slog.e(TAG, "Failed to pipe client and service streams", e); @@ -992,6 +995,22 @@ public final class ContentCaptureManagerService extends mParentService.mPackagesWithShareRequests .remove(mDataShareRequest.getPackageName()); } + if (receivedData) { + try { + mClientAdapter.finish(); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to call finish() the client operation", e); + } + try { + serviceAdapter.finish(); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to call finish() the service operation", e); + } + } else { + // Client or service may have crashed before sending. + sendErrorSignal(mClientAdapter, serviceAdapter, + ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN); + } } }); |