diff options
author | 2025-02-26 19:17:26 -0800 | |
---|---|---|
committer | 2025-02-26 19:17:26 -0800 | |
commit | e1679f7dd9e5786dc51971f43df85052a55b43b7 (patch) | |
tree | a2ea66330adfdc8b6c88edfa9dd122f719220c55 /libs/binder | |
parent | 1be265c82b97e58c13d96eb0e77b2725a1ac6151 (diff) | |
parent | 72782217cefc24c7f4374b45bcab7e6bd50d964d (diff) |
Merge "libbinder: Send ancillary FDs to Trusty" into main am: 4a4e0dded0 am: 72782217ce
Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/3011994
Change-Id: I46a3683cf425684adb7f7ec27dbc5907a611d4d7
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
Diffstat (limited to 'libs/binder')
-rw-r--r-- | libs/binder/RpcTransportTipcAndroid.cpp | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/libs/binder/RpcTransportTipcAndroid.cpp b/libs/binder/RpcTransportTipcAndroid.cpp index 3819fb6472..14c0bde7c5 100644 --- a/libs/binder/RpcTransportTipcAndroid.cpp +++ b/libs/binder/RpcTransportTipcAndroid.cpp @@ -21,6 +21,7 @@ #include <log/log.h> #include <poll.h> #include <trusty/tipc.h> +#include <type_traits> #include "FdTrigger.h" #include "RpcState.h" @@ -32,6 +33,9 @@ using android::binder::unique_fd; namespace android { +// Corresponds to IPC_MAX_MSG_HANDLES in the Trusty kernel +constexpr size_t kMaxTipcHandles = 8; + // RpcTransport for writing Trusty IPC clients in Android. class RpcTransportTipcAndroid : public RpcTransport { public: @@ -78,12 +82,28 @@ public: FdTrigger* fdTrigger, iovec* iovs, int niovs, const std::optional<SmallFunction<status_t()>>& altPoll, const std::vector<std::variant<unique_fd, borrowed_fd>>* ancillaryFds) override { + bool sentFds = false; auto writeFn = [&](iovec* iovs, size_t niovs) -> ssize_t { - // TODO: send ancillaryFds. For now, we just abort if anyone tries - // to send any. - LOG_ALWAYS_FATAL_IF(ancillaryFds != nullptr && !ancillaryFds->empty(), - "File descriptors are not supported on Trusty yet"); - return TEMP_FAILURE_RETRY(tipc_send(mSocket.fd.get(), iovs, niovs, nullptr, 0)); + trusty_shm shms[kMaxTipcHandles] = {{0}}; + ssize_t shm_count = 0; + + if (!sentFds && ancillaryFds != nullptr && !ancillaryFds->empty()) { + if (ancillaryFds->size() > kMaxTipcHandles) { + ALOGE("Too many file descriptors for TIPC: %zu", ancillaryFds->size()); + errno = EINVAL; + return -1; + } + for (const auto& fdVariant : *ancillaryFds) { + shms[shm_count++] = {std::visit([](const auto& fd) { return fd.get(); }, + fdVariant), + TRUSTY_SEND_SECURE_OR_SHARE}; + } + } + + auto ret = TEMP_FAILURE_RETRY(tipc_send(mSocket.fd.get(), iovs, niovs, + (shm_count == 0) ? nullptr : shms, shm_count)); + sentFds |= ret >= 0; + return ret; }; status_t status = interruptableReadOrWrite(mSocket, fdTrigger, iovs, niovs, writeFn, |