diff options
-rw-r--r-- | libs/binder/Android.bp | 1 | ||||
-rw-r--r-- | libs/binder/RpcTransportTipcAndroid.cpp | 30 | ||||
-rw-r--r-- | services/gpuservice/vts/OWNERS | 1 | ||||
-rw-r--r-- | services/surfaceflinger/CompositionEngine/src/ClientCompositionRequestCache.cpp | 3 |
4 files changed, 28 insertions, 7 deletions
diff --git a/libs/binder/Android.bp b/libs/binder/Android.bp index aac369ddd1..9d9ae31ccf 100644 --- a/libs/binder/Android.bp +++ b/libs/binder/Android.bp @@ -826,6 +826,7 @@ cc_library { // so we restrict its visibility to the Trusty-specific packages. visibility: [ ":__subpackages__", + "//hardware/interfaces/security/see:__subpackages__", "//system/core/trusty:__subpackages__", "//vendor:__subpackages__", ], 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, diff --git a/services/gpuservice/vts/OWNERS b/services/gpuservice/vts/OWNERS index a980866ae6..13a089fc02 100644 --- a/services/gpuservice/vts/OWNERS +++ b/services/gpuservice/vts/OWNERS @@ -1,6 +1,5 @@ # Bug component: 653544 kocdemir@google.com paulthomson@google.com -lfy@google.com chrisforbes@google.com alecmouri@google.com diff --git a/services/surfaceflinger/CompositionEngine/src/ClientCompositionRequestCache.cpp b/services/surfaceflinger/CompositionEngine/src/ClientCompositionRequestCache.cpp index d9018bc3ab..dc841952c9 100644 --- a/services/surfaceflinger/CompositionEngine/src/ClientCompositionRequestCache.cpp +++ b/services/surfaceflinger/CompositionEngine/src/ClientCompositionRequestCache.cpp @@ -38,7 +38,8 @@ inline bool equalIgnoringSource(const renderengine::LayerSettings& lhs, lhs.disableBlending == rhs.disableBlending && lhs.shadow == rhs.shadow && lhs.backgroundBlurRadius == rhs.backgroundBlurRadius && lhs.stretchEffect == rhs.stretchEffect && - lhs.edgeExtensionEffect == rhs.edgeExtensionEffect; + lhs.edgeExtensionEffect == rhs.edgeExtensionEffect && + lhs.whitePointNits == rhs.whitePointNits; } inline bool equalIgnoringBuffer(const renderengine::Buffer& lhs, const renderengine::Buffer& rhs) { |