diff options
author | Steven Moreland <smoreland@google.com> | 2019-11-20 17:24:21 -0800 |
---|---|---|
committer | Steven Moreland <smoreland@google.com> | 2019-11-21 15:57:34 -0800 |
commit | 21560ab7fa447aef2f90816e250aa1e06ba5948a (patch) | |
tree | 9149b16708300d9ebb0ba12eda302d7c7e56e617 | |
parent | e395da30584636114dd77c8dd0cf3c7560305ee8 (diff) | |
download | native-21560ab7fa447aef2f90816e250aa1e06ba5948a.tar.gz |
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
-rw-r--r-- | libs/binder/include/binder/IInterface.h | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/libs/binder/include/binder/IInterface.h b/libs/binder/include/binder/IInterface.h index 28ffa48e32..8d72a6b98b 100644 --- a/libs/binder/include/binder/IInterface.h +++ b/libs/binder/include/binder/IInterface.h @@ -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> inline sp<INTERFACE> interface_cast(const sp<IBinder>& 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> |