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

Commit 21560ab7 authored by Steven Moreland's avatar Steven Moreland
Browse files

libbinder: checked_interface_cast

Since interface_cast doesn't check the interface (it waits for calls to
start returning BAD_TYPE).

Bug: 136027762
Test: w/ test-vintf-vibrator-ext-client

Change-Id: I0f6382430521e84967fc58179fd54079faabeb6a
parent e395da30
Loading
Loading
Loading
Loading
+20 −0
Original line number Original line Diff line number Diff line
@@ -38,12 +38,32 @@ protected:


// ----------------------------------------------------------------------
// ----------------------------------------------------------------------


/**
 * If this is a local object and the descriptor matches, this will return the
 * actual local object which is implementing the interface. Otherwise, this will
 * return a proxy to the interface without checking the interface descriptor.
 * This means that subsequent calls may fail with BAD_TYPE.
 */
template<typename INTERFACE>
template<typename INTERFACE>
inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj)
inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj)
{
{
    return INTERFACE::asInterface(obj);
    return INTERFACE::asInterface(obj);
}
}


/**
 * This is the same as interface_cast, except that it always checks to make sure
 * the descriptor matches, and if it doesn't match, it will return nullptr.
 */
template<typename INTERFACE>
inline sp<INTERFACE> checked_interface_cast(const sp<IBinder>& obj)
{
    if (obj->getInterfaceDescriptor() != INTERFACE::descriptor) {
        return nullptr;
    }

    return interface_cast<INTERFACE>(obj);
}

// ----------------------------------------------------------------------
// ----------------------------------------------------------------------


template<typename INTERFACE>
template<typename INTERFACE>