summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Moreland <smoreland@google.com>2019-11-20 17:24:21 -0800
committerSteven Moreland <smoreland@google.com>2019-11-21 15:57:34 -0800
commit21560ab7fa447aef2f90816e250aa1e06ba5948a (patch)
tree9149b16708300d9ebb0ba12eda302d7c7e56e617
parente395da30584636114dd77c8dd0cf3c7560305ee8 (diff)
downloadnative-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.h20
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>