Use IBinder to uniquely identify binder callbacks.
The callback pointer might be different for the same callback, convert
it to IBinder and use that to identify callbacks instead.
Bug: 62293007
Test: mma
Change-Id: Ibd1c2de1192dd7d4f4bc498b0590f5b7f3de3aff
diff --git a/binder_service_android.cc b/binder_service_android.cc
index 91a2970..e179c62 100644
--- a/binder_service_android.cc
+++ b/binder_service_android.cc
@@ -63,13 +63,15 @@
const android::sp<IUpdateEngineCallback>& callback, bool* return_value) {
callbacks_.emplace_back(callback);
+ const android::sp<IBinder>& callback_binder =
+ IUpdateEngineCallback::asBinder(callback);
auto binder_wrapper = android::BinderWrapper::Get();
binder_wrapper->RegisterForDeathNotifications(
- IUpdateEngineCallback::asBinder(callback),
+ callback_binder,
base::Bind(
base::IgnoreResult(&BinderUpdateEngineAndroidService::UnbindCallback),
base::Unretained(this),
- base::Unretained(callback.get())));
+ base::Unretained(callback_binder.get())));
// Send an status update on connection (except when no update sent so far),
// since the status update is oneway and we don't need to wait for the
@@ -83,11 +85,12 @@
Status BinderUpdateEngineAndroidService::unbind(
const android::sp<IUpdateEngineCallback>& callback, bool* return_value) {
+ const android::sp<IBinder>& callback_binder =
+ IUpdateEngineCallback::asBinder(callback);
auto binder_wrapper = android::BinderWrapper::Get();
- binder_wrapper->UnregisterForDeathNotifications(
- IUpdateEngineCallback::asBinder(callback));
+ binder_wrapper->UnregisterForDeathNotifications(callback_binder);
- *return_value = UnbindCallback(callback.get());
+ *return_value = UnbindCallback(callback_binder.get());
return Status::ok();
}
@@ -139,14 +142,13 @@
return Status::ok();
}
-bool BinderUpdateEngineAndroidService::UnbindCallback(
- IUpdateEngineCallback* callback) {
- auto it =
- std::find_if(callbacks_.begin(),
- callbacks_.end(),
- [&callback](const android::sp<IUpdateEngineCallback>& elem) {
- return elem.get() == callback;
- });
+bool BinderUpdateEngineAndroidService::UnbindCallback(const IBinder* callback) {
+ auto it = std::find_if(
+ callbacks_.begin(),
+ callbacks_.end(),
+ [&callback](const android::sp<IUpdateEngineCallback>& elem) {
+ return IUpdateEngineCallback::asBinder(elem).get() == callback;
+ });
if (it == callbacks_.end()) {
LOG(ERROR) << "Unable to unbind unknown callback.";
return false;
diff --git a/binder_service_android.h b/binder_service_android.h
index 375dad4..7d66fcc 100644
--- a/binder_service_android.h
+++ b/binder_service_android.h
@@ -73,7 +73,7 @@
// Remove the passed |callback| from the list of registered callbacks. Called
// on unbind() or whenever the callback object is destroyed.
// Returns true on success.
- bool UnbindCallback(android::os::IUpdateEngineCallback* callback);
+ bool UnbindCallback(const IBinder* callback);
// List of currently bound callbacks.
std::vector<android::sp<android::os::IUpdateEngineCallback>> callbacks_;