summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Steven Moreland <smoreland@google.com> 2018-11-14 11:34:20 -0800
committer android-build-merger <android-build-merger@google.com> 2018-11-14 11:34:20 -0800
commitae209feb97879bd7ebaa9128d037c0342e897be5 (patch)
tree43cb0d9963412ca47d719db091e6c71660b9ba66
parent61d15cb931cd7c6679f2cfba7eb9f8fa5b738045 (diff)
parenta6d2152f14b27f7120fb4adc9df72f369ad834cb (diff)
Merge "libbinder: detach ParcelFileDescriptor comm"
am: a6d2152f14 Change-Id: I1e0383f588ec369e613cd01b164ccd42240d3102
-rw-r--r--libs/binder/Parcel.cpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp
index b3ae09b405..07d5c4bb2c 100644
--- a/libs/binder/Parcel.cpp
+++ b/libs/binder/Parcel.cpp
@@ -2239,8 +2239,30 @@ int Parcel::readParcelFileDescriptor() const
int32_t hasComm = readInt32();
int fd = readFileDescriptor();
if (hasComm != 0) {
- // skip
- readFileDescriptor();
+ // detach (owned by the binder driver)
+ int comm = readFileDescriptor();
+
+ // warning: this must be kept in sync with:
+ // frameworks/base/core/java/android/os/ParcelFileDescriptor.java
+ enum ParcelFileDescriptorStatus {
+ DETACHED = 2,
+ };
+
+#if BYTE_ORDER == BIG_ENDIAN
+ const int32_t message = ParcelFileDescriptorStatus::DETACHED;
+#endif
+#if BYTE_ORDER == LITTLE_ENDIAN
+ const int32_t message = __builtin_bswap32(ParcelFileDescriptorStatus::DETACHED);
+#endif
+
+ ssize_t written = TEMP_FAILURE_RETRY(
+ ::write(comm, &message, sizeof(message)));
+
+ if (written == -1 || written != sizeof(message)) {
+ ALOGW("Failed to detach ParcelFileDescriptor written: %zd err: %s",
+ written, strerror(errno));
+ return BAD_TYPE;
+ }
}
return fd;
}