diff options
author | 2021-11-12 22:54:53 +0000 | |
---|---|---|
committer | 2022-07-01 05:50:52 +0000 | |
commit | 32150288f88b2a1a6e7268b24cd8b2646b1af5d6 (patch) | |
tree | 4dab826b41b4fec3fb19ed9d4aa2be1364d300f0 | |
parent | ffa3aaac5513bc2ef6c7d3f88db9976f86275f88 (diff) |
libbinder: build option to disable the kernel IPC, part 1/2
Add a new BINDER_WITH_KERNEL_IPC macro to enable all code that
uses IPCThreadState or ProcessState. This macro is defined for
Android libbinder but left out for non-Android builds.
Bug: 224644083
Test: m
Change-Id: I622757fcc0f9885dbf271c0ffa84c54938d50774
-rw-r--r-- | libs/binder/Android.bp | 1 | ||||
-rw-r--r-- | libs/binder/Binder.cpp | 13 | ||||
-rw-r--r-- | libs/binder/BpBinder.cpp | 71 | ||||
-rw-r--r-- | libs/binder/BuildFlags.h | 6 | ||||
-rw-r--r-- | libs/binder/Debug.cpp | 6 | ||||
-rw-r--r-- | libs/binder/RpcState.cpp | 6 |
6 files changed, 91 insertions, 12 deletions
diff --git a/libs/binder/Android.bp b/libs/binder/Android.bp index 9389bec509..27000e8c0f 100644 --- a/libs/binder/Android.bp +++ b/libs/binder/Android.bp @@ -174,6 +174,7 @@ cc_library { "-Wreorder-init-list", "-DANDROID_BASE_UNIQUE_FD_DISABLE_IMPLICIT_CONVERSION", "-DANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION", + "-DBINDER_WITH_KERNEL_IPC", ], product_variables: { binder32bit: { diff --git a/libs/binder/Binder.cpp b/libs/binder/Binder.cpp index e2db1a389c..b9a8ba9651 100644 --- a/libs/binder/Binder.cpp +++ b/libs/binder/Binder.cpp @@ -38,6 +38,7 @@ #include <linux/sched.h> #endif +#include "BuildFlags.h" #include "RpcState.h" namespace android { @@ -164,6 +165,10 @@ status_t IBinder::setRpcClientDebug(android::base::unique_fd socketFd, ALOGW("setRpcClientDebug disallowed because RPC is not enabled"); return INVALID_OPERATION; } + if (!kEnableKernelIpc) { + ALOGW("setRpcClientDebug disallowed because kernel binder is not enabled"); + return INVALID_OPERATION; + } BBinder* local = this->localBinder(); if (local != nullptr) { @@ -515,6 +520,10 @@ status_t BBinder::setRpcClientDebug(const Parcel& data) { ALOGW("%s: disallowed because RPC is not enabled", __PRETTY_FUNCTION__); return INVALID_OPERATION; } + if (!kEnableKernelIpc) { + ALOGW("setRpcClientDebug disallowed because kernel binder is not enabled"); + return INVALID_OPERATION; + } uid_t uid = IPCThreadState::self()->getCallingUid(); if (uid != AID_ROOT) { ALOGE("%s: not allowed because client %" PRIu32 " is not root", __PRETTY_FUNCTION__, uid); @@ -540,6 +549,10 @@ status_t BBinder::setRpcClientDebug(android::base::unique_fd socketFd, ALOGW("%s: disallowed because RPC is not enabled", __PRETTY_FUNCTION__); return INVALID_OPERATION; } + if (!kEnableKernelIpc) { + ALOGW("setRpcClientDebug disallowed because kernel binder is not enabled"); + return INVALID_OPERATION; + } const int socketFdForPrint = socketFd.get(); LOG_RPC_DETAIL("%s(fd=%d)", __PRETTY_FUNCTION__, socketFdForPrint); diff --git a/libs/binder/BpBinder.cpp b/libs/binder/BpBinder.cpp index 1eb2ffd22d..49fc19518f 100644 --- a/libs/binder/BpBinder.cpp +++ b/libs/binder/BpBinder.cpp @@ -28,6 +28,8 @@ #include <stdio.h> +#include "BuildFlags.h" + //#undef ALOGV //#define ALOGV(...) fprintf(stderr, __VA_ARGS__) @@ -115,6 +117,11 @@ void BpBinder::ObjectManager::kill() // --------------------------------------------------------------------------- sp<BpBinder> BpBinder::create(int32_t handle) { + if constexpr (!kEnableKernelIpc) { + LOG_ALWAYS_FATAL("Binder kernel driver disabled at build time"); + return nullptr; + } + int32_t trackedUid = -1; if (sCountByUidEnabled) { trackedUid = IPCThreadState::self()->getCallingUid(); @@ -177,6 +184,11 @@ BpBinder::BpBinder(Handle&& handle) } BpBinder::BpBinder(BinderHandle&& handle, int32_t trackedUid) : BpBinder(Handle(handle)) { + if constexpr (!kEnableKernelIpc) { + LOG_ALWAYS_FATAL("Binder kernel driver disabled at build time"); + return; + } + mTrackedUid = trackedUid; ALOGV("Creating BpBinder %p handle %d\n", this, this->binderHandle()); @@ -303,6 +315,11 @@ status_t BpBinder::transact( status = rpcSession()->transact(sp<IBinder>::fromExisting(this), code, data, reply, flags); } else { + if constexpr (!kEnableKernelIpc) { + LOG_ALWAYS_FATAL("Binder kernel driver disabled at build time"); + return INVALID_OPERATION; + } + status = IPCThreadState::self()->transact(binderHandle(), code, data, reply, flags); } if (data.dataSize() > LOG_TRANSACTIONS_OVER_SIZE) { @@ -328,6 +345,11 @@ status_t BpBinder::linkToDeath( { if (isRpcBinder()) return UNKNOWN_TRANSACTION; + if constexpr (!kEnableKernelIpc) { + LOG_ALWAYS_FATAL("Binder kernel driver disabled at build time"); + return INVALID_OPERATION; + } + Obituary ob; ob.recipient = recipient; ob.cookie = cookie; @@ -366,6 +388,11 @@ status_t BpBinder::unlinkToDeath( { if (isRpcBinder()) return UNKNOWN_TRANSACTION; + if constexpr (!kEnableKernelIpc) { + LOG_ALWAYS_FATAL("Binder kernel driver disabled at build time"); + return INVALID_OPERATION; + } + AutoMutex _l(mLock); if (mObitsSent) { @@ -401,6 +428,11 @@ void BpBinder::sendObituary() { LOG_ALWAYS_FATAL_IF(isRpcBinder(), "Cannot send obituary for remote binder."); + if constexpr (!kEnableKernelIpc) { + LOG_ALWAYS_FATAL("Binder kernel driver disabled at build time"); + return; + } + ALOGV("Sending obituary for proxy %p handle %d, mObitsSent=%s\n", this, binderHandle(), mObitsSent ? "true" : "false"); @@ -469,12 +501,16 @@ BpBinder* BpBinder::remoteBinder() return this; } -BpBinder::~BpBinder() -{ - ALOGV("Destroying BpBinder %p handle %d\n", this, binderHandle()); - +BpBinder::~BpBinder() { if (CC_UNLIKELY(isRpcBinder())) return; + if constexpr (!kEnableKernelIpc) { + LOG_ALWAYS_FATAL("Binder kernel driver disabled at build time"); + return; + } + + ALOGV("Destroying BpBinder %p handle %d\n", this, binderHandle()); + IPCThreadState* ipc = IPCThreadState::self(); if (mTrackedUid >= 0) { @@ -505,21 +541,31 @@ BpBinder::~BpBinder() } } -void BpBinder::onFirstRef() -{ - ALOGV("onFirstRef BpBinder %p handle %d\n", this, binderHandle()); +void BpBinder::onFirstRef() { if (CC_UNLIKELY(isRpcBinder())) return; + + if constexpr (!kEnableKernelIpc) { + LOG_ALWAYS_FATAL("Binder kernel driver disabled at build time"); + return; + } + + ALOGV("onFirstRef BpBinder %p handle %d\n", this, binderHandle()); IPCThreadState* ipc = IPCThreadState::self(); if (ipc) ipc->incStrongHandle(binderHandle(), this); } -void BpBinder::onLastStrongRef(const void* /*id*/) -{ - ALOGV("onLastStrongRef BpBinder %p handle %d\n", this, binderHandle()); +void BpBinder::onLastStrongRef(const void* /*id*/) { if (CC_UNLIKELY(isRpcBinder())) { (void)rpcSession()->sendDecStrong(this); return; } + + if constexpr (!kEnableKernelIpc) { + LOG_ALWAYS_FATAL("Binder kernel driver disabled at build time"); + return; + } + + ALOGV("onLastStrongRef BpBinder %p handle %d\n", this, binderHandle()); IF_ALOGV() { printRefs(); } @@ -552,6 +598,11 @@ bool BpBinder::onIncStrongAttempted(uint32_t /*flags*/, const void* /*id*/) // RPC binder doesn't currently support inc from weak binders if (CC_UNLIKELY(isRpcBinder())) return false; + if constexpr (!kEnableKernelIpc) { + LOG_ALWAYS_FATAL("Binder kernel driver disabled at build time"); + return false; + } + ALOGV("onIncStrongAttempted BpBinder %p handle %d\n", this, binderHandle()); IPCThreadState* ipc = IPCThreadState::self(); return ipc ? ipc->attemptIncStrongHandle(binderHandle()) == NO_ERROR : false; diff --git a/libs/binder/BuildFlags.h b/libs/binder/BuildFlags.h index 7657246212..3e9d1c2b4a 100644 --- a/libs/binder/BuildFlags.h +++ b/libs/binder/BuildFlags.h @@ -22,4 +22,10 @@ constexpr bool kEnableRpcThreads = false; constexpr bool kEnableRpcThreads = true; #endif +#ifdef BINDER_WITH_KERNEL_IPC +constexpr bool kEnableKernelIpc = true; +#else // BINDER_WITH_KERNEL_IPC +constexpr bool kEnableKernelIpc = false; +#endif // BINDER_WITH_KERNEL_IPC + } // namespace android diff --git a/libs/binder/Debug.cpp b/libs/binder/Debug.cpp index e4ac4b49a4..c6e4fb378d 100644 --- a/libs/binder/Debug.cpp +++ b/libs/binder/Debug.cpp @@ -15,6 +15,7 @@ */ #include "Debug.h" +#include "BuildFlags.h" #include <binder/ProcessState.h> @@ -301,6 +302,11 @@ void printHexData(int32_t indent, const void *buf, size_t length, } ssize_t getBinderKernelReferences(size_t count, uintptr_t* buf) { + if constexpr (!kEnableKernelIpc) { + LOG_ALWAYS_FATAL("Binder kernel driver disabled at build time"); + return 0; + } + sp<ProcessState> proc = ProcessState::selfOrNull(); if (proc.get() == nullptr) { return 0; diff --git a/libs/binder/RpcState.cpp b/libs/binder/RpcState.cpp index 01311b505f..bde3d90d90 100644 --- a/libs/binder/RpcState.cpp +++ b/libs/binder/RpcState.cpp @@ -36,7 +36,6 @@ namespace android { -using base::ScopeGuard; using base::StringPrintf; #if RPC_FLAKE_PRONE @@ -733,6 +732,7 @@ status_t RpcState::processCommand( const sp<RpcSession::RpcConnection>& connection, const sp<RpcSession>& session, const RpcWireHeader& command, CommandType type, std::vector<std::variant<base::unique_fd, base::borrowed_fd>>&& ancillaryFds) { +#ifdef BINDER_WITH_KERNEL_IPC IPCThreadState* kernelBinderState = IPCThreadState::selfOrNull(); IPCThreadState::SpGuard spGuard{ .address = __builtin_frame_address(0), @@ -742,11 +742,13 @@ status_t RpcState::processCommand( if (kernelBinderState != nullptr) { origGuard = kernelBinderState->pushGetCallingSpGuard(&spGuard); } - ScopeGuard guardUnguard = [&]() { + + base::ScopeGuard guardUnguard = [&]() { if (kernelBinderState != nullptr) { kernelBinderState->restoreGetCallingSpGuard(origGuard); } }; +#endif // BINDER_WITH_KERNEL_IPC switch (command.command) { case RPC_COMMAND_TRANSACT: |