diff options
| author | 2021-05-14 23:02:07 +0000 | |
|---|---|---|
| committer | 2021-05-17 23:08:22 +0000 | |
| commit | b534faa4fefe12e817aaa00398029d489d4549cf (patch) | |
| tree | 80183bb94a5ea632666fc9c2db24b73a1c2faa7a | |
| parent | 009a6872b1fb24c739827663aed0b03e8ff6dbf2 (diff) | |
Revert "libbinder: introduce guards for getCalling*"
Revert submission 1707789
Reason for revert: potential cause of b/188228705
Reverted Changes:
Id8fc889f4:libbinder: binder RPC - using getCalling* aborts
I2145ad0e7:libbinder: introduce guards for getCalling*
Bug: 188228705
Change-Id: Id824b7dff55f5cd1a7ac5f2443bd9604fba9fe63
Merged-In: Id824b7dff55f5cd1a7ac5f2443bd9604fba9fe63
| -rw-r--r-- | libs/binder/IPCThreadState.cpp | 44 | ||||
| -rw-r--r-- | libs/binder/include/binder/IPCThreadState.h | 27 | ||||
| -rw-r--r-- | libs/binder/tests/binderLibTest.cpp | 36 |
3 files changed, 9 insertions, 98 deletions
diff --git a/libs/binder/IPCThreadState.cpp b/libs/binder/IPCThreadState.cpp index 18b77e6692..ef7fd44419 100644 --- a/libs/binder/IPCThreadState.cpp +++ b/libs/binder/IPCThreadState.cpp @@ -366,45 +366,19 @@ status_t IPCThreadState::clearLastError() pid_t IPCThreadState::getCallingPid() const { - checkContextIsBinderForUse(__func__); return mCallingPid; } const char* IPCThreadState::getCallingSid() const { - checkContextIsBinderForUse(__func__); return mCallingSid; } uid_t IPCThreadState::getCallingUid() const { - checkContextIsBinderForUse(__func__); return mCallingUid; } -IPCThreadState::SpGuard* IPCThreadState::pushGetCallingSpGuard(SpGuard* guard) { - SpGuard* orig = mServingStackPointerGuard; - mServingStackPointerGuard = guard; - return orig; -} - -void IPCThreadState::restoreGetCallingSpGuard(SpGuard* guard) { - mServingStackPointerGuard = guard; -} - -void IPCThreadState::checkContextIsBinderForUse(const char* use) const { - if (mServingStackPointerGuard == nullptr) return; - - if (!mServingStackPointer || mServingStackPointerGuard < mServingStackPointer) { - LOG_ALWAYS_FATAL("In context %s, %s does not make sense.", - mServingStackPointerGuard->context, use); - } - - // in the case mServingStackPointer is deeper in the stack than the guard, - // we must be serving a binder transaction (maybe nested). This is a binder - // context, so we don't abort -} - int64_t IPCThreadState::clearCallingIdentity() { // ignore mCallingSid for legacy reasons @@ -873,15 +847,15 @@ status_t IPCThreadState::clearDeathNotification(int32_t handle, BpBinder* proxy) } IPCThreadState::IPCThreadState() - : mProcess(ProcessState::self()), - mServingStackPointer(nullptr), - mServingStackPointerGuard(nullptr), - mWorkSource(kUnsetWorkSource), - mPropagateWorkSource(false), - mIsLooper(false), - mStrictModePolicy(0), - mLastTransactionBinderFlags(0), - mCallRestriction(mProcess->mCallRestriction) { + : mProcess(ProcessState::self()), + mServingStackPointer(nullptr), + mWorkSource(kUnsetWorkSource), + mPropagateWorkSource(false), + mIsLooper(false), + mStrictModePolicy(0), + mLastTransactionBinderFlags(0), + mCallRestriction(mProcess->mCallRestriction) +{ pthread_setspecific(gTLS, this); clearCaller(); mIn.setDataCapacity(256); diff --git a/libs/binder/include/binder/IPCThreadState.h b/libs/binder/include/binder/IPCThreadState.h index 5220b62d62..23a0cb0148 100644 --- a/libs/binder/include/binder/IPCThreadState.h +++ b/libs/binder/include/binder/IPCThreadState.h @@ -81,32 +81,6 @@ public: */ uid_t getCallingUid() const; - /** - * Make it an abort to rely on getCalling* for a section of - * execution. - * - * Usage: - * IPCThreadState::SpGuard guard { "..." }; - * auto* orig = pushGetCallingSpGuard(&guard); - * { - * // will abort if you call getCalling*, unless you are - * // serving a nested binder transaction - * } - * restoreCallingSpGuard(orig); - */ - struct SpGuard { - const char* context; - }; - SpGuard* pushGetCallingSpGuard(SpGuard* guard); - void restoreGetCallingSpGuard(SpGuard* guard); - /** - * Used internally by getCalling*. Can also be used to assert that - * you are in a binder context (getCalling* is valid). This is - * intentionally not exposed as a boolean API since code should be - * written to know its environment. - */ - void checkContextIsBinderForUse(const char* use) const; - void setStrictModePolicy(int32_t policy); int32_t getStrictModePolicy() const; @@ -229,7 +203,6 @@ private: Parcel mOut; status_t mLastError; const void* mServingStackPointer; - SpGuard* mServingStackPointerGuard; pid_t mCallingPid; const char* mCallingSid; uid_t mCallingUid; diff --git a/libs/binder/tests/binderLibTest.cpp b/libs/binder/tests/binderLibTest.cpp index 45b277624c..0c3fbcd2da 100644 --- a/libs/binder/tests/binderLibTest.cpp +++ b/libs/binder/tests/binderLibTest.cpp @@ -73,7 +73,6 @@ enum BinderLibTestTranscationCode { BINDER_LIB_TEST_REGISTER_SERVER, BINDER_LIB_TEST_ADD_SERVER, BINDER_LIB_TEST_ADD_POLL_SERVER, - BINDER_LIB_TEST_USE_CALLING_GUARD_TRANSACTION, BINDER_LIB_TEST_CALL_BACK, BINDER_LIB_TEST_CALL_BACK_VERIFY_BUF, BINDER_LIB_TEST_DELAYED_CALL_BACK, @@ -605,24 +604,6 @@ TEST_F(BinderLibTest, CallBack) EXPECT_THAT(callBack->getResult(), StatusEq(NO_ERROR)); } -TEST_F(BinderLibTest, NoBinderCallContextGuard) { - IPCThreadState::SpGuard spGuard{"NoBinderCallContext"}; - IPCThreadState::SpGuard *origGuard = IPCThreadState::self()->pushGetCallingSpGuard(&spGuard); - - // yes, this test uses threads, but it's careful and uses fork in addServer - EXPECT_DEATH({ IPCThreadState::self()->getCallingPid(); }, - "In context NoBinderCallContext, getCallingPid does not make sense."); - - IPCThreadState::self()->restoreGetCallingSpGuard(origGuard); -} - -TEST_F(BinderLibTest, BinderCallContextGuard) { - sp<IBinder> binder = addServer(); - Parcel data, reply; - EXPECT_THAT(binder->transact(BINDER_LIB_TEST_USE_CALLING_GUARD_TRANSACTION, data, &reply), - StatusEq(DEAD_OBJECT)); -} - TEST_F(BinderLibTest, AddServer) { sp<IBinder> server = addServer(); @@ -1281,18 +1262,6 @@ class BinderLibTestService : public BBinder pthread_mutex_unlock(&m_serverWaitMutex); return ret; } - case BINDER_LIB_TEST_USE_CALLING_GUARD_TRANSACTION: { - IPCThreadState::SpGuard spGuard{"GuardInBinderTransaction"}; - IPCThreadState::SpGuard *origGuard = - IPCThreadState::self()->pushGetCallingSpGuard(&spGuard); - - // if the guard works, this should abort - (void)IPCThreadState::self()->getCallingPid(); - - IPCThreadState::self()->restoreGetCallingSpGuard(origGuard); - return NO_ERROR; - } - case BINDER_LIB_TEST_GETPID: reply->writeInt32(getpid()); return NO_ERROR; @@ -1520,11 +1489,6 @@ int run_server(int index, int readypipefd, bool usePoll) { binderLibTestServiceName += String16(binderserversuffix); - // Testing to make sure that calls that we are serving can use getCallin* - // even though we don't here. - IPCThreadState::SpGuard spGuard{"main server thread"}; - (void)IPCThreadState::self()->pushGetCallingSpGuard(&spGuard); - status_t ret; sp<IServiceManager> sm = defaultServiceManager(); BinderLibTestService* testServicePtr; |