diff options
author | Jeff Brown <jeffbrown@google.com> | 2011-11-05 02:35:57 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2011-11-05 02:35:57 +0000 |
commit | efd912c05c0ef550a1c5ba7a14281261f6a0f9f4 (patch) | |
tree | 36828ed995591754042ed8b5bff3b178b1afd25b | |
parent | 60e2245b63c54c8776ef97ce4bccb4d1510f85f1 (diff) | |
parent | 93ff1f985e233fe04412a65041e977c9f0c21f5b (diff) | |
download | frameworks_native-efd912c05c0ef550a1c5ba7a14281261f6a0f9f4.zip frameworks_native-efd912c05c0ef550a1c5ba7a14281261f6a0f9f4.tar.gz frameworks_native-efd912c05c0ef550a1c5ba7a14281261f6a0f9f4.tar.bz2 |
am 5462bc63: Fix a leak in Parcel::writeBlob.
* commit '5462bc6318b4b70e7a58c66994e2bd79f59d9739':
Fix a leak in Parcel::writeBlob.
-rw-r--r-- | include/binder/Parcel.h | 3 | ||||
-rw-r--r-- | libs/binder/Parcel.cpp | 13 |
2 files changed, 6 insertions, 10 deletions
diff --git a/include/binder/Parcel.h b/include/binder/Parcel.h index 3fa2acb..33b2f00 100644 --- a/include/binder/Parcel.h +++ b/include/binder/Parcel.h @@ -110,7 +110,8 @@ public: // Place a file descriptor into the parcel. The given fd must remain // valid for the lifetime of the parcel. - status_t writeFileDescriptor(int fd); + // The Parcel does not take ownership of the given fd unless you ask it to. + status_t writeFileDescriptor(int fd, bool takeOwnership = false); // Place a file descriptor into the parcel. A dup of the fd is made, which // will be closed once the parcel is destroyed. diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp index c7180ce..6b4c1a6 100644 --- a/libs/binder/Parcel.cpp +++ b/libs/binder/Parcel.cpp @@ -710,24 +710,19 @@ status_t Parcel::writeNativeHandle(const native_handle* handle) return err; } -status_t Parcel::writeFileDescriptor(int fd) +status_t Parcel::writeFileDescriptor(int fd, bool takeOwnership) { flat_binder_object obj; obj.type = BINDER_TYPE_FD; obj.flags = 0x7f | FLAT_BINDER_FLAG_ACCEPTS_FDS; obj.handle = fd; - obj.cookie = (void*)0; + obj.cookie = (void*) (takeOwnership ? 1 : 0); return writeObject(obj, true); } status_t Parcel::writeDupFileDescriptor(int fd) { - flat_binder_object obj; - obj.type = BINDER_TYPE_FD; - obj.flags = 0x7f | FLAT_BINDER_FLAG_ACCEPTS_FDS; - obj.handle = dup(fd); - obj.cookie = (void*)1; - return writeObject(obj, true); + return writeFileDescriptor(dup(fd), true /*takeOwnership*/); } status_t Parcel::writeBlob(size_t len, WritableBlob* outBlob) @@ -764,7 +759,7 @@ status_t Parcel::writeBlob(size_t len, WritableBlob* outBlob) } else { status = writeInt32(1); if (!status) { - status = writeFileDescriptor(fd); + status = writeFileDescriptor(fd, true /*takeOwnership*/); if (!status) { outBlob->init(true /*mapped*/, ptr, len); return NO_ERROR; |