diff options
-rw-r--r-- | libs/binder/IPCThreadState.cpp | 8 | ||||
-rw-r--r-- | libs/binder/ProcessState.cpp | 10 | ||||
-rw-r--r-- | libs/binder/include/binder/IPCThreadState.h | 9 | ||||
-rw-r--r-- | libs/binder/tests/binderLibTest.cpp | 6 |
4 files changed, 29 insertions, 4 deletions
diff --git a/libs/binder/IPCThreadState.cpp b/libs/binder/IPCThreadState.cpp index 0c71ed81a4..33e7d479fd 100644 --- a/libs/binder/IPCThreadState.cpp +++ b/libs/binder/IPCThreadState.cpp @@ -448,6 +448,14 @@ int32_t IPCThreadState::getLastTransactionBinderFlags() const return mLastTransactionBinderFlags; } +void IPCThreadState::setCallRestriction(ProcessState::CallRestriction restriction) { + mCallRestriction = restriction; +} + +ProcessState::CallRestriction IPCThreadState::getCallRestriction() const { + return mCallRestriction; +} + void IPCThreadState::restoreCallingIdentity(int64_t token) { mCallingUid = (int)(token>>32); diff --git a/libs/binder/ProcessState.cpp b/libs/binder/ProcessState.cpp index a53056560e..83ca687519 100644 --- a/libs/binder/ProcessState.cpp +++ b/libs/binder/ProcessState.cpp @@ -282,9 +282,17 @@ sp<IBinder> ProcessState::getStrongProxyForHandle(int32_t handle) // a driver API to get a handle to the context manager with // proper reference counting. + IPCThreadState* ipc = IPCThreadState::self(); + + CallRestriction originalCallRestriction = ipc->getCallRestriction(); + ipc->setCallRestriction(CallRestriction::NONE); + Parcel data; - status_t status = IPCThreadState::self()->transact( + status_t status = ipc->transact( 0, IBinder::PING_TRANSACTION, data, nullptr, 0); + + ipc->setCallRestriction(originalCallRestriction); + if (status == DEAD_OBJECT) return nullptr; } diff --git a/libs/binder/include/binder/IPCThreadState.h b/libs/binder/include/binder/IPCThreadState.h index cdecceae4f..867d3074ca 100644 --- a/libs/binder/include/binder/IPCThreadState.h +++ b/libs/binder/include/binder/IPCThreadState.h @@ -32,6 +32,8 @@ namespace android { class IPCThreadState { public: + using CallRestriction = ProcessState::CallRestriction; + static IPCThreadState* self(); static IPCThreadState* selfOrNull(); // self(), but won't instantiate @@ -96,6 +98,9 @@ public: void setLastTransactionBinderFlags(int32_t flags); int32_t getLastTransactionBinderFlags() const; + void setCallRestriction(CallRestriction restriction); + CallRestriction getCallRestriction() const; + int64_t clearCallingIdentity(); // Restores PID/UID (not SID) void restoreCallingIdentity(int64_t token); @@ -154,7 +159,6 @@ public: // This constant needs to be kept in sync with Binder.UNSET_WORKSOURCE from the Java // side. static const int32_t kUnsetWorkSource = -1; - private: IPCThreadState(); ~IPCThreadState(); @@ -201,8 +205,7 @@ private: bool mPropagateWorkSource; int32_t mStrictModePolicy; int32_t mLastTransactionBinderFlags; - - ProcessState::CallRestriction mCallRestriction; + CallRestriction mCallRestriction; }; } // namespace android diff --git a/libs/binder/tests/binderLibTest.cpp b/libs/binder/tests/binderLibTest.cpp index 145c09940b..c9cd102279 100644 --- a/libs/binder/tests/binderLibTest.cpp +++ b/libs/binder/tests/binderLibTest.cpp @@ -599,6 +599,12 @@ TEST_F(BinderLibTest, AddServer) ASSERT_TRUE(server != nullptr); } +TEST_F(BinderLibTest, AddManagerToManager) { + sp<IServiceManager> sm = defaultServiceManager(); + sp<IBinder> binder = IInterface::asBinder(sm); + EXPECT_EQ(NO_ERROR, sm->addService(String16("binderLibTest-manager"), binder)); +} + TEST_F(BinderLibTest, DeathNotificationStrongRef) { status_t ret; |