Merge "libbinder: avoid attached objects for stability"

This commit is contained in:
Steven Moreland 2020-03-04 21:05:54 +00:00 committed by Gerrit Code Review
commit 1ed44fd5bb
5 changed files with 34 additions and 9 deletions

View file

@ -141,7 +141,7 @@ public:
// ---------------------------------------------------------------------------
BBinder::BBinder() : mExtras(nullptr)
BBinder::BBinder() : mExtras(nullptr), mStability(0)
{
}

View file

@ -138,6 +138,7 @@ BpBinder* BpBinder::create(int32_t handle) {
BpBinder::BpBinder(int32_t handle, int32_t trackedUid)
: mHandle(handle)
, mStability(0)
, mAlive(1)
, mObitsSent(0)
, mObituaries(nullptr)

View file

@ -15,6 +15,9 @@
*/
#include <binder/Stability.h>
#include <binder/BpBinder.h>
#include <binder/Binder.h>
namespace android {
namespace internal {
@ -78,11 +81,12 @@ status_t Stability::set(IBinder* binder, int32_t stability, bool log) {
if (currentStability == stability) return OK;
binder->attachObject(
reinterpret_cast<void*>(&Stability::get),
reinterpret_cast<void*>(stability),
nullptr /*cleanupCookie*/,
nullptr /*cleanup function*/);
BBinder* local = binder->localBinder();
if (local != nullptr) {
local->mStability = static_cast<int32_t>(stability);
} else {
binder->remoteBinder()->mStability = static_cast<int32_t>(stability);
}
return OK;
}
@ -90,8 +94,12 @@ status_t Stability::set(IBinder* binder, int32_t stability, bool log) {
Stability::Level Stability::get(IBinder* binder) {
if (binder == nullptr) return UNDECLARED;
return static_cast<Level>(reinterpret_cast<intptr_t>(
binder->findObject(reinterpret_cast<void*>(&Stability::get))));
BBinder* local = binder->localBinder();
if (local != nullptr) {
return static_cast<Stability::Level>(local->mStability);
}
return static_cast<Stability::Level>(binder->remoteBinder()->mStability);
}
bool Stability::check(int32_t provided, Level required) {

View file

@ -24,6 +24,10 @@
// ---------------------------------------------------------------------------
namespace android {
namespace internal {
class Stability;
}
class BBinder : public IBinder
{
public:
@ -88,7 +92,12 @@ private:
Extras* getOrCreateExtras();
std::atomic<Extras*> mExtras;
void* mReserved0;
friend ::android::internal::Stability;
union {
int32_t mStability;
void* mReserved0;
};
};
// ---------------------------------------------------------------------------

View file

@ -27,6 +27,10 @@
// ---------------------------------------------------------------------------
namespace android {
namespace internal {
class Stability;
};
using binder_proxy_limit_callback = void(*)(int);
class BpBinder : public IBinder
@ -116,6 +120,9 @@ protected:
private:
const int32_t mHandle;
friend ::android::internal::Stability;
int32_t mStability;
struct Obituary {
wp<DeathRecipient> recipient;
void* cookie;