From 5e74d2db3fa66d80e872333779bfc8600d4ac242 Mon Sep 17 00:00:00 2001 From: Andrei Homescu Date: Fri, 19 Aug 2022 22:46:38 +0000 Subject: libbinder: keep track of multiple connections in RpcServerTrusty Correctly keep track of each individual RpcConnection made to RpcServerTrusty and close the correct one on cleanup. The code previously assumed that each session would only have one connection, which is not necessarily the case in practice with multi-threaded Android clients. Bug: 224644083 Test: Trusty tests Change-Id: I12d04de803e0c5df5c658cdbaf3dd0d45e10ef20 --- libs/binder/trusty/RpcServerTrusty.cpp | 35 +++++++++++++++++----- .../binder/trusty/include/binder/RpcServerTrusty.h | 6 ++++ 2 files changed, 34 insertions(+), 7 deletions(-) (limited to 'libs') diff --git a/libs/binder/trusty/RpcServerTrusty.cpp b/libs/binder/trusty/RpcServerTrusty.cpp index e8b91e7a4c..c789614c0b 100644 --- a/libs/binder/trusty/RpcServerTrusty.cpp +++ b/libs/binder/trusty/RpcServerTrusty.cpp @@ -104,8 +104,17 @@ int RpcServerTrusty::handleConnect(const tipc_port* port, handle_t chan, const u return; } - /* Save the session for easy access */ - *ctx_p = session.get(); + /* Save the session and connection for the other callbacks */ + auto* channelContext = new (std::nothrow) ChannelContext; + if (channelContext == nullptr) { + rc = ERR_NO_MEMORY; + return; + } + + channelContext->session = std::move(session); + channelContext->connection = std::move(result.connection); + + *ctx_p = channelContext; }; base::unique_fd clientFd(chan); @@ -119,9 +128,14 @@ int RpcServerTrusty::handleConnect(const tipc_port* port, handle_t chan, const u } int RpcServerTrusty::handleMessage(const tipc_port* port, handle_t chan, void* ctx) { - auto* session = reinterpret_cast(ctx); - status_t status = session->state()->drainCommands(session->mConnections.mIncoming[0], session, - RpcState::CommandType::ANY); + auto* channelContext = reinterpret_cast(ctx); + LOG_ALWAYS_FATAL_IF(channelContext == nullptr, + "bad state: message received on uninitialized channel"); + + auto& session = channelContext->session; + auto& connection = channelContext->connection; + status_t status = + session->state()->drainCommands(connection, session, RpcState::CommandType::ANY); if (status != OK) { LOG_RPC_DETAIL("Binder connection thread closing w/ status %s", statusToString(status).c_str()); @@ -133,10 +147,17 @@ int RpcServerTrusty::handleMessage(const tipc_port* port, handle_t chan, void* c void RpcServerTrusty::handleDisconnect(const tipc_port* port, handle_t chan, void* ctx) {} void RpcServerTrusty::handleChannelCleanup(void* ctx) { - auto* session = reinterpret_cast(ctx); - auto& connection = session->mConnections.mIncoming.at(0); + auto* channelContext = reinterpret_cast(ctx); + if (channelContext == nullptr) { + return; + } + + auto& session = channelContext->session; + auto& connection = channelContext->connection; LOG_ALWAYS_FATAL_IF(!session->removeIncomingConnection(connection), "bad state: connection object guaranteed to be in list"); + + delete channelContext; } } // namespace android diff --git a/libs/binder/trusty/include/binder/RpcServerTrusty.h b/libs/binder/trusty/include/binder/RpcServerTrusty.h index e8fc9f988d..cc31c95da1 100644 --- a/libs/binder/trusty/include/binder/RpcServerTrusty.h +++ b/libs/binder/trusty/include/binder/RpcServerTrusty.h @@ -77,6 +77,12 @@ private: explicit RpcServerTrusty(std::unique_ptr ctx, std::string&& portName, std::shared_ptr&& portAcl, size_t msgMaxSize); + // The Rpc-specific context maintained for every open TIPC channel. + struct ChannelContext { + sp session; + sp connection; + }; + static int handleConnect(const tipc_port* port, handle_t chan, const uuid* peer, void** ctx_p); static int handleMessage(const tipc_port* port, handle_t chan, void* ctx); static void handleDisconnect(const tipc_port* port, handle_t chan, void* ctx); -- cgit v1.2.3-59-g8ed1b From b7e037bdc02fdb0baf858f79b327745a831ef43d Mon Sep 17 00:00:00 2001 From: Andrei Homescu Date: Tue, 23 Aug 2022 21:32:22 +0000 Subject: libbinder: update Trusty README Bug: 224644083 Test: N/A Change-Id: Ic4716ad06a834d1148e00efd11ba0ea6bcc12b26 --- libs/binder/trusty/README.md | 72 ++++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 33 deletions(-) (limited to 'libs') diff --git a/libs/binder/trusty/README.md b/libs/binder/trusty/README.md index 1a273aab10..8a60af8b23 100644 --- a/libs/binder/trusty/README.md +++ b/libs/binder/trusty/README.md @@ -1,39 +1,45 @@ # Binder for Trusty This is the Trusty port of the libbinder library. -To build it, take the following steps: - -* Check out copies of the Trusty and AOSP repositories. -* Apply the patches from the `trusty_binder` topic on both repositories. -* Build Trusty normally using `build.py`. -* Run the sample AIDL test for Trusty: - ```shell - $ ./build-root/.../run --headless --boot-test com.android.trusty.aidl.test - ``` - -To run the Android-Trusty IPC test, do the following: - -* Build AOSP for the `qemu_trusty_arm64-userdebug` target: - ```shell - $ lunch qemu_trusty_arm64-userdebug - $ m - ``` -* In the Trusty directory, run the emulator with the newly built Android: - ```shell - $ ./build-root/.../run --android /path/to/aosp - ``` -* Using either `adb` or the shell inside the emulator itself, run the Trusty - Binder test as root: - ```shell - # /data/nativetest64/vendor/trusty_binder_test/trusty_binder_test - ``` - -## Running the AIDL compiler -For now, you will need to run the AIDL compiler manually to generate the C++ -source code for Trusty clients and services. The general syntax is: +To build it, first you will need a checkout of the Trusty tree: ```shell -$ aidl --lang=cpp -o -h +$ mkdir /path/to/trusty +$ cd /path/to/trusty +$ repo init -u https://android.googlesource.com/trusty/manifest -b master +$ repo sync -j$(nproc) -c --no-tags ``` -The compiler will emit some `.cpp` files in the output directory and their -corresponding `.h` files in the header directory. +After the checkout is complete, you can use the `build.py` script for both +building and testing Trusty. For a quick build without any tests, run: +```shell +$ ./trusty/vendor/google/aosp/scripts/build.py generic-arm64-test-debug +``` +This will build the smaller `generic-arm64-test-debug` project which +does not run any tests. + +The qemu-generic-arm64-test-debug` project includes the QEMU emulator and +a full Trusty test suite, including a set of libbinder tests. +To run the latter, use the command: +```shell +$ ./trusty/vendor/google/aosp/scripts/build.py \ + --test "boot-test:com.android.trusty.binder.test" \ + qemu-generic-arm64-test-debug +``` + +## Building AIDL files on Trusty +To compile AIDL interfaces into Trusty libraries, include the `make/aidl.mk` +in your `rules.mk` file, e.g.: +``` +LOCAL_DIR := $(GET_LOCAL_DIR) + +MODULE := $(LOCAL_DIR) + +MODULE_AIDLS := \ + $(LOCAL_DIR)/IFoo.aidl \ + +include make/aidl.mk +``` + +## Examples +The Trusty tree contains some sample test apps at +`trusty/user/app/sample/binder-test`. -- cgit v1.2.3-59-g8ed1b