From 639490b9ec6535cda7f24403237355c941e9fcb2 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Wed, 1 Nov 2023 13:49:41 -0700 Subject: Binder unique_fd Test: mma Bug: 302723053 Change-Id: I52f14cadb027b3f854946d5315dce3d23aa21b19 --- libs/binder/Parcel.cpp | 49 +++++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 18 deletions(-) (limited to 'libs/binder/Parcel.cpp') diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp index 94f3631b79..47e3f91ac2 100644 --- a/libs/binder/Parcel.cpp +++ b/libs/binder/Parcel.cpp @@ -93,6 +93,8 @@ static size_t pad_size(size_t s) { namespace android { using namespace android::binder::impl; +using binder::borrowed_fd; +using binder::unique_fd; // many things compile this into prebuilts on the stack #ifdef __LP64__ @@ -171,7 +173,7 @@ static void release_object(const sp& proc, const flat_binder_objec } #endif // BINDER_WITH_KERNEL_IPC -static int toRawFd(const std::variant& v) { +static int toRawFd(const std::variant& v) { return std::visit([](const auto& fd) { return fd.get(); }, v); } @@ -626,7 +628,7 @@ status_t Parcel::appendFrom(const Parcel* parcel, size_t offset, size_t len) { if (status_t status = binder::os::dupFileDescriptor(oldFd, &newFd); status != OK) { ALOGW("Failed to duplicate file descriptor %d: %s", oldFd, strerror(-status)); } - rpcFields->mFds->emplace_back(base::unique_fd(newFd)); + rpcFields->mFds->emplace_back(unique_fd(newFd)); // Fixup the index in the data. mDataPos = newDataPos + 4; if (status_t status = writeInt32(rpcFields->mFds->size() - 1); status != OK) { @@ -1206,9 +1208,16 @@ status_t Parcel::writeUtf8VectorAsUtf16Vector( const std::unique_ptr>>& val) { return writeData(val); } status_t Parcel::writeUtf8VectorAsUtf16Vector(const std::vector& val) { return writeData(val); } -status_t Parcel::writeUniqueFileDescriptorVector(const std::vector& val) { return writeData(val); } -status_t Parcel::writeUniqueFileDescriptorVector(const std::optional>& val) { return writeData(val); } -status_t Parcel::writeUniqueFileDescriptorVector(const std::unique_ptr>& val) { return writeData(val); } +status_t Parcel::writeUniqueFileDescriptorVector(const std::vector& val) { + return writeData(val); +} +status_t Parcel::writeUniqueFileDescriptorVector(const std::optional>& val) { + return writeData(val); +} +status_t Parcel::writeUniqueFileDescriptorVector( + const std::unique_ptr>& val) { + return writeData(val); +} status_t Parcel::writeStrongBinderVector(const std::vector>& val) { return writeData(val); } status_t Parcel::writeStrongBinderVector(const std::optional>>& val) { return writeData(val); } @@ -1261,9 +1270,16 @@ status_t Parcel::readUtf8VectorFromUtf16Vector( std::unique_ptr>>* val) const { return readData(val); } status_t Parcel::readUtf8VectorFromUtf16Vector(std::vector* val) const { return readData(val); } -status_t Parcel::readUniqueFileDescriptorVector(std::optional>* val) const { return readData(val); } -status_t Parcel::readUniqueFileDescriptorVector(std::unique_ptr>* val) const { return readData(val); } -status_t Parcel::readUniqueFileDescriptorVector(std::vector* val) const { return readData(val); } +status_t Parcel::readUniqueFileDescriptorVector(std::optional>* val) const { + return readData(val); +} +status_t Parcel::readUniqueFileDescriptorVector( + std::unique_ptr>* val) const { + return readData(val); +} +status_t Parcel::readUniqueFileDescriptorVector(std::vector* val) const { + return readData(val); +} status_t Parcel::readStrongBinderVector(std::optional>>* val) const { return readData(val); } status_t Parcel::readStrongBinderVector(std::unique_ptr>>* val) const { return readData(val); } @@ -1463,11 +1479,11 @@ status_t Parcel::writeNativeHandle(const native_handle* handle) status_t Parcel::writeFileDescriptor(int fd, bool takeOwnership) { if (auto* rpcFields = maybeRpcFields()) { - std::variant fdVariant; + std::variant fdVariant; if (takeOwnership) { - fdVariant = base::unique_fd(fd); + fdVariant = unique_fd(fd); } else { - fdVariant = base::borrowed_fd(fd); + fdVariant = borrowed_fd(fd); } if (!mAllowFds) { return FDS_NOT_ALLOWED; @@ -1546,7 +1562,7 @@ status_t Parcel::writeDupParcelFileDescriptor(int fd) return err; } -status_t Parcel::writeUniqueFileDescriptor(const base::unique_fd& fd) { +status_t Parcel::writeUniqueFileDescriptor(const unique_fd& fd) { return writeDupFileDescriptor(fd.get()); } @@ -2349,8 +2365,7 @@ int Parcel::readParcelFileDescriptor() const { return fd; } -status_t Parcel::readUniqueFileDescriptor(base::unique_fd* val) const -{ +status_t Parcel::readUniqueFileDescriptor(unique_fd* val) const { int got = readFileDescriptor(); if (got == BAD_TYPE) { @@ -2371,8 +2386,7 @@ status_t Parcel::readUniqueFileDescriptor(base::unique_fd* val) const return OK; } -status_t Parcel::readUniqueParcelFileDescriptor(base::unique_fd* val) const -{ +status_t Parcel::readUniqueParcelFileDescriptor(unique_fd* val) const { int got = readParcelFileDescriptor(); if (got == BAD_TYPE) { @@ -2664,8 +2678,7 @@ void Parcel::ipcSetDataReference(const uint8_t* data, size_t dataSize, const bin status_t Parcel::rpcSetDataReference( const sp& session, const uint8_t* data, size_t dataSize, const uint32_t* objectTable, size_t objectTableSize, - std::vector>&& ancillaryFds, - release_func relFunc) { + std::vector>&& ancillaryFds, release_func relFunc) { // this code uses 'mOwner == nullptr' to understand whether it owns memory LOG_ALWAYS_FATAL_IF(relFunc == nullptr, "must provide cleanup function"); -- cgit v1.2.3-59-g8ed1b