summaryrefslogtreecommitdiff
path: root/services/contentcapture
diff options
context:
space:
mode:
authorYara Hassan <yaraabdullatif@google.com>2020-05-20 18:31:21 +0100
committerAhaan Ugale <augale@google.com>2020-05-29 14:36:22 -0700
commitcf146dfa3909cffb169ef30c195109a0c528ff2c (patch)
tree4ddae72694baf7148e5c1bc2329d2b691cd4deac /services/contentcapture
parentdc699fb8cea5f97020152b75641dfcb641e7e96a (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')
-rw-r--r--services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java21
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);
+ }
}
});