summaryrefslogtreecommitdiff
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
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
-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);
+ }
}
});