Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d62b89be authored by Steven Moreland's avatar Steven Moreland
Browse files

libbinderthreadstateutils: don't init binder

Don't initialize binder/hwbinder thread state if they
aren't already initialized. This is fine - if we
know they aren't initialized, then there is no binder
call going.

Bug: 205282403
Test: libbinderthreadstateutils_test
TesT: binderRpcTest (because it uses these APIs in a special way)
Change-Id: Id67010bb15559e85dd764746525562acc7e1f13c
parent 00be6932
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -36,8 +36,12 @@ enum class BinderCallType {
// Based on where we are in recursion of nested binder/hwbinder calls, determine
// which one we are closer to.
inline static BinderCallType getCurrentServingCall() {
    const void* hwbinderSp = android::hardware::IPCThreadState::self()->getServingStackPointer();
    const void* binderSp = android::IPCThreadState::self()->getServingStackPointer();
    auto* hwState = android::hardware::IPCThreadState::selfOrNull();
    auto* state = android::IPCThreadState::selfOrNull();

    // getServingStackPointer can also return nullptr
    const void* hwbinderSp = hwState ? hwState->getServingStackPointer() : nullptr;
    const void* binderSp = state ? state->getServingStackPointer() : nullptr;

    if (hwbinderSp == nullptr && binderSp == nullptr) return BinderCallType::NONE;
    if (hwbinderSp == nullptr) return BinderCallType::BINDER;
+19 −0
Original line number Diff line number Diff line
@@ -16,11 +16,16 @@

#include <BnAidlStuff.h>
#include <android-base/logging.h>
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
#include <binderthreadstate/CallerUtils.h>
#include <binderthreadstateutilstest/1.0/IHidlStuff.h>
#include <gtest/gtest.h>
#include <hidl/HidlTransportSupport.h>
#include <hwbinder/IPCThreadState.h>

#include <thread>

#include <linux/prctl.h>
#include <sys/prctl.h>

@@ -154,6 +159,20 @@ TEST(BinderThreadState, LocalAidlCall) {
    EXPECT_TRUE(server->callLocal().isOk());
}

TEST(BinderThreadState, DoesntInitializeBinderDriver) {
    // this is on another thread, because it's testing thread-specific
    // state and we expect it not to be initialized.
    std::thread([&] {
        EXPECT_EQ(nullptr, android::IPCThreadState::selfOrNull());
        EXPECT_EQ(nullptr, android::hardware::IPCThreadState::selfOrNull());

        (void)getCurrentServingCall();

        EXPECT_EQ(nullptr, android::IPCThreadState::selfOrNull());
        EXPECT_EQ(nullptr, android::hardware::IPCThreadState::selfOrNull());
    }).join();
}

TEST(BindThreadState, RemoteHidlCall) {
    auto stuff = IHidlStuff::getService(id2name(kP1Id));
    ASSERT_NE(nullptr, stuff);