Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 332edaa9 authored by Kalesh Singh's avatar Kalesh Singh Committed by Automerger Merge Worker
Browse files

Merge "libbinder_ndk: Add stability downgrade" am: 0e046dd2 am: c97ad524

Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/1661238

Change-Id: Ie0f113b997e0a8103bb1986e94949f9da940899d
parents a7104037 c97ad524
Loading
Loading
Loading
Loading
+14 −2
Original line number Original line Diff line number Diff line
@@ -38,18 +38,30 @@ Stability::Category Stability::Category::currentFromLevel(Level level) {
    };
    };
}
}


void Stability::forceDowngradeCompilationUnit(const sp<IBinder>& binder) {
void Stability::forceDowngradeToStability(const sp<IBinder>& binder, Level level) {
    // Downgrading a remote binder would require also copying the version from
    // Downgrading a remote binder would require also copying the version from
    // the binder sent here. In practice though, we don't need to downgrade the
    // the binder sent here. In practice though, we don't need to downgrade the
    // stability of a remote binder, since this would as an effect only restrict
    // stability of a remote binder, since this would as an effect only restrict
    // what we can do to it.
    // what we can do to it.
    LOG_ALWAYS_FATAL_IF(!binder || !binder->localBinder(), "Can only downgrade local binder");
    LOG_ALWAYS_FATAL_IF(!binder || !binder->localBinder(), "Can only downgrade local binder");


    auto stability = Category::currentFromLevel(getLocalLevel());
    auto stability = Category::currentFromLevel(level);
    status_t result = setRepr(binder.get(), stability.repr(), REPR_LOG | REPR_ALLOW_DOWNGRADE);
    status_t result = setRepr(binder.get(), stability.repr(), REPR_LOG | REPR_ALLOW_DOWNGRADE);
    LOG_ALWAYS_FATAL_IF(result != OK, "Should only mark known object.");
    LOG_ALWAYS_FATAL_IF(result != OK, "Should only mark known object.");
}
}


void Stability::forceDowngradeToLocalStability(const sp<IBinder>& binder) {
    forceDowngradeToStability(binder, getLocalLevel());
}

void Stability::forceDowngradeToSystemStability(const sp<IBinder>& binder) {
    forceDowngradeToStability(binder, Level::SYSTEM);
}

void Stability::forceDowngradeToVendorStability(const sp<IBinder>& binder) {
    forceDowngradeToStability(binder, Level::VENDOR);
}

std::string Stability::Category::debugString() {
std::string Stability::Category::debugString() {
    return levelString(level) + " wire protocol version "
    return levelString(level) + " wire protocol version "
        + std::to_string(version);
        + std::to_string(version);
+30 −2
Original line number Original line Diff line number Diff line
@@ -54,8 +54,33 @@ public:
    // Given a binder interface at a certain stability, there may be some
    // Given a binder interface at a certain stability, there may be some
    // requirements associated with that higher stability level. For instance, a
    // requirements associated with that higher stability level. For instance, a
    // VINTF stability binder is required to be in the VINTF manifest. This API
    // VINTF stability binder is required to be in the VINTF manifest. This API
    // can be called to use that same interface within a partition.
    // can be called to use that same interface within the local partition.
    static void forceDowngradeCompilationUnit(const sp<IBinder>& binder);
    static void forceDowngradeToLocalStability(const sp<IBinder>& binder);

    // WARNING: The only client of
    //      - forceDowngradeToSystemStability() and;
    //      - korceDowngradeToVendorStability()
    //  should be AIBinder_forceDowngradeToLocalStability().
    //
    // getLocalLevel() in libbinder returns Level::SYSTEM when called
    // from libbinder_ndk (even on vendor partition). So we explicitly provide
    // these methods for use by the NDK API:
    //      AIBinder_forceDowngradeToLocalStability().
    //
    // This allows correctly downgrading the binder's stability to either system/vendor,
    // depending on the partition.

    // Given a binder interface at a certain stability, there may be some
    // requirements associated with that higher stability level. For instance, a
    // VINTF stability binder is required to be in the VINTF manifest. This API
    // can be called to use that same interface within the vendor partition.
    static void forceDowngradeToVendorStability(const sp<IBinder>& binder);

    // Given a binder interface at a certain stability, there may be some
    // requirements associated with that higher stability level. For instance, a
    // VINTF stability binder is required to be in the VINTF manifest. This API
    // can be called to use that same interface within the system partition.
    static void forceDowngradeToSystemStability(const sp<IBinder>& binder);


    // WARNING: Below APIs are only ever expected to be called by auto-generated code.
    // WARNING: Below APIs are only ever expected to be called by auto-generated code.
    //     Instead of calling them, you should set the stability of a .aidl interface
    //     Instead of calling them, you should set the stability of a .aidl interface
@@ -146,6 +171,9 @@ private:
    // returns the stability according to how this was built
    // returns the stability according to how this was built
    static Level getLocalLevel();
    static Level getLocalLevel();


    // Downgrades binder stability to the specified level.
    static void forceDowngradeToStability(const sp<IBinder>& binder, Level level);

    enum {
    enum {
      REPR_NONE = 0,
      REPR_NONE = 0,
      REPR_LOG = 1,
      REPR_LOG = 1,
+24 −0
Original line number Original line Diff line number Diff line
@@ -45,6 +45,18 @@ static inline void AIBinder_markCompilationUnitStability(AIBinder* binder) {
    AIBinder_markVendorStability(binder);
    AIBinder_markVendorStability(binder);
}
}


/**
 * Given a binder interface at a certain stability, there may be some
 * requirements associated with that higher stability level. For instance, a
 * VINTF stability binder is required to be in the VINTF manifest. This API
 * can be called to use that same interface within the vendor partition.
 */
void AIBinder_forceDowngradeToVendorStability(AIBinder* binder);

static inline void AIBinder_forceDowngradeToLocalStability(AIBinder* binder) {
    AIBinder_forceDowngradeToVendorStability(binder);
}

#else  // defined(__ANDROID_VENDOR__)
#else  // defined(__ANDROID_VENDOR__)


enum {
enum {
@@ -62,6 +74,18 @@ static inline void AIBinder_markCompilationUnitStability(AIBinder* binder) {
    AIBinder_markSystemStability(binder);
    AIBinder_markSystemStability(binder);
}
}


/**
 * Given a binder interface at a certain stability, there may be some
 * requirements associated with that higher stability level. For instance, a
 * VINTF stability binder is required to be in the VINTF manifest. This API
 * can be called to use that same interface within the system partition.
 */
void AIBinder_forceDowngradeToSystemStability(AIBinder* binder);

static inline void AIBinder_forceDowngradeToLocalStability(AIBinder* binder) {
    AIBinder_forceDowngradeToSystemStability(binder);
}

#endif  // defined(__ANDROID_VENDOR__)
#endif  // defined(__ANDROID_VENDOR__)


/**
/**
+3 −0
Original line number Original line Diff line number Diff line
@@ -127,6 +127,9 @@ LIBBINDER_NDK31 { # introduced=31
    AServiceManager_tryUnregister; # llndk
    AServiceManager_tryUnregister; # llndk
    AServiceManager_reRegister; # llndk
    AServiceManager_reRegister; # llndk


    AIBinder_forceDowngradeToSystemStability; # apex
    AIBinder_forceDowngradeToVendorStability; # llndk

    AIBinder_Class_getDescriptor;
    AIBinder_Class_getDescriptor;
    AIBinder_Weak_clone;
    AIBinder_Weak_clone;
    AIBinder_Weak_lt;
    AIBinder_Weak_lt;
+10 −1
Original line number Original line Diff line number Diff line
@@ -31,7 +31,7 @@ using ::android::internal::Stability;
#error libbinder_ndk should only be built in a system context
#error libbinder_ndk should only be built in a system context
#endif
#endif


// explicit extern because symbol is only declared in header when __ANDROID_VNDK__
// explicit extern because symbol is only declared in header when __ANDROID_VENDOR__
extern "C" void AIBinder_markVendorStability(AIBinder* binder) {
extern "C" void AIBinder_markVendorStability(AIBinder* binder) {
    Stability::markVndk(binder->getBinder().get());
    Stability::markVndk(binder->getBinder().get());
}
}
@@ -43,3 +43,12 @@ void AIBinder_markSystemStability(AIBinder* binder) {
void AIBinder_markVintfStability(AIBinder* binder) {
void AIBinder_markVintfStability(AIBinder* binder) {
    Stability::markVintf(binder->getBinder().get());
    Stability::markVintf(binder->getBinder().get());
}
}

// explicit extern because symbol is only declared in header when __ANDROID_VENDOR__
extern "C" void AIBinder_forceDowngradeToVendorStability(AIBinder* binder) {
    Stability::forceDowngradeToVendorStability(binder->getBinder());
}

void AIBinder_forceDowngradeToSystemStability(AIBinder* binder) {
    Stability::forceDowngradeToSystemStability(binder->getBinder());
}
Loading