summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Steven Moreland <smoreland@google.com> 2021-08-06 15:38:59 -0700
committer Steven Moreland <smoreland@google.com> 2021-08-06 15:40:20 -0700
commitc6746a7cb87c4a146ad3e16fffcf3c44e5b59dcf (patch)
tree60e8e5743f04cc3d109f6d9c6620d5eb2b6bddf7
parent5d4f84df73627101d47341429e00b04448755aff (diff)
SharedRefBase: detect double-ownership
If the internal SharedRefBase weak_ptr is promotable while it is being destroyed, this means that the SharedRefBase object is double-owned, and something else deleted it. Add an explicit log for this case. Fixes: 194905504 Test: libbinder_ndk_unit_test Change-Id: Ib6aa09ff8e659e52eebe96c14d127a6e7c186cff
-rw-r--r--libs/binder/ndk/include_cpp/android/binder_interface_utils.h6
-rw-r--r--libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp11
2 files changed, 17 insertions, 0 deletions
diff --git a/libs/binder/ndk/include_cpp/android/binder_interface_utils.h b/libs/binder/ndk/include_cpp/android/binder_interface_utils.h
index 6c4472632d..5de64f8c5c 100644
--- a/libs/binder/ndk/include_cpp/android/binder_interface_utils.h
+++ b/libs/binder/ndk/include_cpp/android/binder_interface_utils.h
@@ -55,6 +55,12 @@ class SharedRefBase {
std::call_once(mFlagThis, [&]() {
__assert(__FILE__, __LINE__, "SharedRefBase: no ref created during lifetime");
});
+
+ if (ref() != nullptr) {
+ __assert(__FILE__, __LINE__,
+ "SharedRefBase: destructed but still able to lock weak_ptr. Is this object "
+ "double-owned?");
+ }
}
/**
diff --git a/libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp b/libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp
index 5ad390e107..b5c06e9089 100644
--- a/libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp
+++ b/libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp
@@ -224,6 +224,17 @@ bool isServiceRunning(const char* serviceName) {
return true;
}
+TEST(NdkBinder, DetectDoubleOwn) {
+ auto badService = ndk::SharedRefBase::make<MyBinderNdkUnitTest>();
+ EXPECT_DEATH(std::shared_ptr<MyBinderNdkUnitTest>(badService.get()),
+ "Is this object double-owned?");
+}
+
+TEST(NdkBinder, DetectNoSharedRefBaseCreated) {
+ EXPECT_DEATH(std::make_shared<MyBinderNdkUnitTest>(),
+ "SharedRefBase: no ref created during lifetime");
+}
+
TEST(NdkBinder, GetServiceThatDoesntExist) {
sp<IFoo> foo = IFoo::getService("asdfghkl;");
EXPECT_EQ(nullptr, foo.get());