diff options
Diffstat (limited to 'libs/binder/Parcel.cpp')
-rw-r--r-- | libs/binder/Parcel.cpp | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp index 03348da773..94968218e0 100644 --- a/libs/binder/Parcel.cpp +++ b/libs/binder/Parcel.cpp @@ -980,12 +980,20 @@ status_t Parcel::writeDupFileDescriptor(int fd) return -errno; } status_t err = writeFileDescriptor(dupFd, true /*takeOwnership*/); - if (err) { + if (err != OK) { close(dupFd); } return err; } +status_t Parcel::writeUniqueFileDescriptor(const ScopedFd& fd) { + return writeDupFileDescriptor(fd.get()); +} + +status_t Parcel::writeUniqueFileDescriptorVector(const std::vector<ScopedFd>& val) { + return writeTypedVector(val, &Parcel::writeUniqueFileDescriptor); +} + status_t Parcel::writeBlob(size_t len, bool mutableCopy, WritableBlob* outBlob) { if (len > INT32_MAX) { @@ -1601,16 +1609,36 @@ native_handle* Parcel::readNativeHandle() const int Parcel::readFileDescriptor() const { const flat_binder_object* flat = readObject(true); - if (flat) { - switch (flat->type) { - case BINDER_TYPE_FD: - //ALOGI("Returning file descriptor %ld from parcel %p", flat->handle, this); - return flat->handle; - } + + if (flat && flat->type == BINDER_TYPE_FD) { + return flat->handle; } + return BAD_TYPE; } +status_t Parcel::readUniqueFileDescriptor(ScopedFd* val) const +{ + int got = readFileDescriptor(); + + if (got == BAD_TYPE) { + return BAD_TYPE; + } + + val->reset(dup(got)); + + if (val->get() < 0) { + return BAD_VALUE; + } + + return OK; +} + + +status_t Parcel::readUniqueFileDescriptorVector(std::vector<ScopedFd>* val) const { + return readTypedVector(val, &Parcel::readUniqueFileDescriptor); +} + status_t Parcel::readBlob(size_t len, ReadableBlob* outBlob) const { int32_t blobType; |