diff options
| author | 2018-11-14 11:34:20 -0800 | |
|---|---|---|
| committer | 2018-11-14 11:34:20 -0800 | |
| commit | ae209feb97879bd7ebaa9128d037c0342e897be5 (patch) | |
| tree | 43cb0d9963412ca47d719db091e6c71660b9ba66 | |
| parent | 61d15cb931cd7c6679f2cfba7eb9f8fa5b738045 (diff) | |
| parent | a6d2152f14b27f7120fb4adc9df72f369ad834cb (diff) | |
Merge "libbinder: detach ParcelFileDescriptor comm"
am: a6d2152f14
Change-Id: I1e0383f588ec369e613cd01b164ccd42240d3102
| -rw-r--r-- | libs/binder/Parcel.cpp | 26 |
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; } |