diff options
author | 2022-08-04 01:33:33 +0000 | |
---|---|---|
committer | 2022-08-16 21:58:41 +0000 | |
commit | 24ad36eec712d42f972b4b83311c86aa0b37e3b7 (patch) | |
tree | ebfe4315fa402676639ba574964aecfeea7ccd67 | |
parent | a8fa78c5fdb652375440aa2b4b412e9e0bbc4c6d (diff) |
libbinder: build ParcelFileDescriptor on Trusty
Adds ParcelFileDescriptor.cpp to the Trusty build
which in turn compiles some extra related code from
Parcel.cpp. This code uses fcntl(...O_DUPFD_CLOEXEC...)
to duplicate file descriptors which is not available
on Trusty (or other OSes), so we abstract the relevant
calls to that function in a wrapper in OS.cpp.
Bug: 224644083
Test: m
Test: build on Trusty
Change-Id: I2e0ee517e7c7b55458a6ee6db977985aab4d7c58
-rw-r--r-- | libs/binder/OS.cpp | 10 | ||||
-rw-r--r-- | libs/binder/OS.h | 2 | ||||
-rw-r--r-- | libs/binder/Parcel.cpp | 27 | ||||
-rw-r--r-- | libs/binder/trusty/OS.cpp | 5 | ||||
-rw-r--r-- | libs/binder/trusty/rules.mk | 1 |
5 files changed, 37 insertions, 8 deletions
diff --git a/libs/binder/OS.cpp b/libs/binder/OS.cpp index 6eb72726f5..cc4a03ba67 100644 --- a/libs/binder/OS.cpp +++ b/libs/binder/OS.cpp @@ -48,4 +48,14 @@ status_t getRandomBytes(uint8_t* data, size_t size) { return OK; } +status_t dupFileDescriptor(int oldFd, int* newFd) { + int ret = fcntl(oldFd, F_DUPFD_CLOEXEC, 0); + if (ret < 0) { + return -errno; + } + + *newFd = ret; + return OK; +} + } // namespace android diff --git a/libs/binder/OS.h b/libs/binder/OS.h index e802e9cede..d6e1c78ae9 100644 --- a/libs/binder/OS.h +++ b/libs/binder/OS.h @@ -28,4 +28,6 @@ android::base::Result<void> setNonBlocking(android::base::borrowed_fd fd); status_t getRandomBytes(uint8_t* data, size_t size); +status_t dupFileDescriptor(int oldFd, int* newFd); + } // namespace android diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp index 8b5d11800f..888757214d 100644 --- a/libs/binder/Parcel.cpp +++ b/libs/binder/Parcel.cpp @@ -48,6 +48,7 @@ #include <utils/String8.h> #include <utils/misc.h> +#include "OS.h" #include "RpcState.h" #include "Static.h" #include "Utils.h" @@ -1477,9 +1478,9 @@ status_t Parcel::writeFileDescriptor(int fd, bool takeOwnership) { status_t Parcel::writeDupFileDescriptor(int fd) { - int dupFd = fcntl(fd, F_DUPFD_CLOEXEC, 0); - if (dupFd < 0) { - return -errno; + int dupFd; + if (status_t err = dupFileDescriptor(fd, &dupFd); err != OK) { + return err; } status_t err = writeFileDescriptor(dupFd, true /*takeOwnership*/); if (err != OK) { @@ -1496,9 +1497,9 @@ status_t Parcel::writeParcelFileDescriptor(int fd, bool takeOwnership) status_t Parcel::writeDupParcelFileDescriptor(int fd) { - int dupFd = fcntl(fd, F_DUPFD_CLOEXEC, 0); - if (dupFd < 0) { - return -errno; + int dupFd; + if (status_t err = dupFileDescriptor(fd, &dupFd); err != OK) { + return err; } status_t err = writeParcelFileDescriptor(dupFd, true /*takeOwnership*/); if (err != OK) { @@ -2295,7 +2296,12 @@ status_t Parcel::readUniqueFileDescriptor(base::unique_fd* val) const return BAD_TYPE; } - val->reset(fcntl(got, F_DUPFD_CLOEXEC, 0)); + int dupFd; + if (status_t err = dupFileDescriptor(got, &dupFd); err != OK) { + return BAD_VALUE; + } + + val->reset(dupFd); if (val->get() < 0) { return BAD_VALUE; @@ -2312,7 +2318,12 @@ status_t Parcel::readUniqueParcelFileDescriptor(base::unique_fd* val) const return BAD_TYPE; } - val->reset(fcntl(got, F_DUPFD_CLOEXEC, 0)); + int dupFd; + if (status_t err = dupFileDescriptor(got, &dupFd); err != OK) { + return BAD_VALUE; + } + + val->reset(dupFd); if (val->get() < 0) { return BAD_VALUE; diff --git a/libs/binder/trusty/OS.cpp b/libs/binder/trusty/OS.cpp index 187add4a7b..bbfa3818ea 100644 --- a/libs/binder/trusty/OS.cpp +++ b/libs/binder/trusty/OS.cpp @@ -32,4 +32,9 @@ status_t getRandomBytes(uint8_t* data, size_t size) { return res == 1 ? OK : UNKNOWN_ERROR; } +status_t dupFileDescriptor(int oldFd, int* newFd) { + // TODO: implement separately + return INVALID_OPERATION; +} + } // namespace android diff --git a/libs/binder/trusty/rules.mk b/libs/binder/trusty/rules.mk index 83475f58d4..d0d0861416 100644 --- a/libs/binder/trusty/rules.mk +++ b/libs/binder/trusty/rules.mk @@ -36,6 +36,7 @@ MODULE_SRCS := \ $(LIBBINDER_DIR)/IInterface.cpp \ $(LIBBINDER_DIR)/IResultReceiver.cpp \ $(LIBBINDER_DIR)/Parcel.cpp \ + $(LIBBINDER_DIR)/ParcelFileDescriptor.cpp \ $(LIBBINDER_DIR)/RpcServer.cpp \ $(LIBBINDER_DIR)/RpcSession.cpp \ $(LIBBINDER_DIR)/RpcState.cpp \ |