diff options
| author | 2021-05-14 17:51:03 +0000 | |
|---|---|---|
| committer | 2021-05-14 17:51:03 +0000 | |
| commit | da55afdbd41f66d33af20c31630f18cfec4616ea (patch) | |
| tree | c4509cb97211ec161f5f67c38c9541e9585912b1 /libs/binder/IPCThreadState.cpp | |
| parent | 982e8b7d3be0eef5f47c715526e11206008f64b7 (diff) | |
| parent | 08cb54f49df91e1a4240eaa916dc0dc65689352e (diff) | |
Merge changes Id8fc889f,I2145ad0e am: 5426122b9b am: 08cb54f49d
Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/1707789
Change-Id: I44d1b684d2a177b71c2a0aa64bd19d5fd1ba7b14
Diffstat (limited to 'libs/binder/IPCThreadState.cpp')
| -rw-r--r-- | libs/binder/IPCThreadState.cpp | 44 | 
1 files changed, 35 insertions, 9 deletions
diff --git a/libs/binder/IPCThreadState.cpp b/libs/binder/IPCThreadState.cpp index ef7fd44419..18b77e6692 100644 --- a/libs/binder/IPCThreadState.cpp +++ b/libs/binder/IPCThreadState.cpp @@ -366,19 +366,45 @@ 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 @@ -847,15 +873,15 @@ status_t IPCThreadState::clearDeathNotification(int32_t handle, BpBinder* proxy)  }  IPCThreadState::IPCThreadState() -    : mProcess(ProcessState::self()), -      mServingStackPointer(nullptr), -      mWorkSource(kUnsetWorkSource), -      mPropagateWorkSource(false), -      mIsLooper(false), -      mStrictModePolicy(0), -      mLastTransactionBinderFlags(0), -      mCallRestriction(mProcess->mCallRestriction) -{ +      : mProcess(ProcessState::self()), +        mServingStackPointer(nullptr), +        mServingStackPointerGuard(nullptr), +        mWorkSource(kUnsetWorkSource), +        mPropagateWorkSource(false), +        mIsLooper(false), +        mStrictModePolicy(0), +        mLastTransactionBinderFlags(0), +        mCallRestriction(mProcess->mCallRestriction) {      pthread_setspecific(gTLS, this);      clearCaller();      mIn.setDataCapacity(256);  |