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

Commit 59aeae8e authored by Alice Ryhl's avatar Alice Ryhl
Browse files

binder: add an isHandlingTransaction method

This method is needed for aosp/1806578 because, although asynchronous
binder calls normally need to be offloaded to a separate thread, this is
not the case for such calls that happen during the handling of another
binder transaction.

The implementation of this method was based on the Java JNI binder
interface in `frameworks/base/core/jni/android_util_Binder.cpp`.

Test: m
Change-Id: Ia6d59f3f466911a27243476714cc5acf2eb4c629
parent 269a5d6d
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -555,6 +555,10 @@ pid_t AIBinder_getCallingPid() {
    return ::android::IPCThreadState::self()->getCallingPid();
}

bool AIBinder_isHandlingTransaction() {
    return ::android::IPCThreadState::self()->getServingStackPointer() != nullptr;
}

void AIBinder_incStrong(AIBinder* binder) {
    if (binder == nullptr) {
        return;
+8 −0
Original line number Diff line number Diff line
@@ -392,6 +392,14 @@ uid_t AIBinder_getCallingUid() __INTRODUCED_IN(29);
 */
pid_t AIBinder_getCallingPid() __INTRODUCED_IN(29);

/**
 * Determine whether the current thread is currently executing an incoming transaction.
 *
 * \return true if the current thread is currently executing an incoming transaction, and false
 * otherwise.
 */
bool AIBinder_isHandlingTransaction() __INTRODUCED_IN(33);

/**
 * This can only be called if a strong reference to this object already exists in process.
 *
+1 −0
Original line number Diff line number Diff line
@@ -145,6 +145,7 @@ LIBBINDER_NDK33 { # introduced=33
  global:
    AIBinder_Class_disableInterfaceTokenHeader;
    AIBinder_DeathRecipient_setOnUnlinked;
    AIBinder_isHandlingTransaction;
    AIBinder_setMinSchedulerPolicy; # llndk
    AParcel_marshal;
    AParcel_unmarshal;
+11 −0
Original line number Diff line number Diff line
@@ -99,6 +99,17 @@ impl ThreadState {
        }
    }

    /// Determine whether the current thread is currently executing an incoming transaction.
    ///
    /// \return true if the current thread is currently executing an incoming transaction, and false
    /// otherwise.
    pub fn is_handling_transaction() -> bool {
        unsafe {
            // Safety: Safe FFI
            sys::AIBinder_isHandlingTransaction()
        }
    }

    /// This function makes the client's security context available to the
    /// service calling this function. This can be used for access control.
    /// It does not suffer from the TOCTOU issues of get_calling_pid.