From 55a125443048bbf908790c75fa91c7741c297209 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Thu, 31 Mar 2022 21:53:11 +0000 Subject: libbinder: add log for dropped extension In the NDK/Rust backend, it's pretty easy to create a binder, attach an extension to it, and then immediately destroy that binder. Here, I add a log when this happens and add a unit test for BBinder which triggers this path (it's never expected to be hit in practice since binders aren't created without being sent). Bug: N/A Test: binderUnitTests Change-Id: Id2b51396b027530e3fad767f698a3b2cecbfa98d --- libs/binder/Binder.cpp | 4 ++++ libs/binder/tests/binderBinderUnitTest.cpp | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/libs/binder/Binder.cpp b/libs/binder/Binder.cpp index 01b25d390d..39befbe8e0 100644 --- a/libs/binder/Binder.cpp +++ b/libs/binder/Binder.cpp @@ -582,6 +582,10 @@ void BBinder::removeRpcServerLink(const sp& link) { BBinder::~BBinder() { + if (!wasParceled() && getExtension()) { + ALOGW("Binder %p destroyed with extension attached before being parceled.", this); + } + Extras* e = mExtras.load(std::memory_order_relaxed); if (e) delete e; } diff --git a/libs/binder/tests/binderBinderUnitTest.cpp b/libs/binder/tests/binderBinderUnitTest.cpp index 1be0c59c78..ce2770f943 100644 --- a/libs/binder/tests/binderBinderUnitTest.cpp +++ b/libs/binder/tests/binderBinderUnitTest.cpp @@ -41,3 +41,10 @@ TEST(Binder, DetachObject) { EXPECT_EQ(kObject1, binder->detachObject(kObjectId1)); EXPECT_EQ(nullptr, binder->attachObject(kObjectId1, kObject2, nullptr, nullptr)); } + +TEST(Binder, AttachExtension) { + auto binder = sp::make(); + auto ext = sp::make(); + binder->setExtension(ext); + EXPECT_EQ(ext, binder->getExtension()); +} -- cgit v1.2.3-59-g8ed1b