From c6746a7cb87c4a146ad3e16fffcf3c44e5b59dcf Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Fri, 6 Aug 2021 15:38:59 -0700 Subject: 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 --- libs/binder/ndk/include_cpp/android/binder_interface_utils.h | 6 ++++++ libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp | 11 +++++++++++ 2 files changed, 17 insertions(+) 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(); + EXPECT_DEATH(std::shared_ptr(badService.get()), + "Is this object double-owned?"); +} + +TEST(NdkBinder, DetectNoSharedRefBaseCreated) { + EXPECT_DEATH(std::make_shared(), + "SharedRefBase: no ref created during lifetime"); +} + TEST(NdkBinder, GetServiceThatDoesntExist) { sp foo = IFoo::getService("asdfghkl;"); EXPECT_EQ(nullptr, foo.get()); -- cgit v1.2.3-59-g8ed1b