Skip to content

Commit 5fd2247

Browse files
Delete user data even on error when registering AccessorProviders
If ABinderRpc_registerAccessorProvider returns nullptr on error, we need to make sure we still call the delete callback on the user data as the user expects to be giving up ownership of it when they make the call. Test: atest binderRpcTest Bug: 358427181 Change-Id: I049e33f88ba202cd97e970276b50903374131eff
1 parent 13c2918 commit 5fd2247

3 files changed

Lines changed: 30 additions & 8 deletions

File tree

libs/binder/ndk/binder_rpc.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -107,16 +107,20 @@ ABinderRpc_AccessorProvider* ABinderRpc_registerAccessorProvider(
107107
ABinderRpc_AccessorProvider_getAccessorCallback provider,
108108
const char* const* const instances, size_t numInstances, void* data,
109109
ABinderRpc_AccessorProviderUserData_deleteCallback onDelete) {
110-
if (provider == nullptr) {
111-
ALOGE("Null provider passed to ABinderRpc_registerAccessorProvider");
112-
return nullptr;
113-
}
114110
if (data && onDelete == nullptr) {
115111
ALOGE("If a non-null data ptr is passed to ABinderRpc_registerAccessorProvider, then a "
116112
"ABinderRpc_AccessorProviderUserData_deleteCallback must also be passed to delete "
117113
"the data object once the ABinderRpc_AccessorProvider is removed.");
118114
return nullptr;
119115
}
116+
// call the onDelete when the last reference of this goes away (when the
117+
// last reference to the generate std::function goes away).
118+
std::shared_ptr<OnDeleteProviderHolder> onDeleteHolder =
119+
std::make_shared<OnDeleteProviderHolder>(data, onDelete);
120+
if (provider == nullptr) {
121+
ALOGE("Null provider passed to ABinderRpc_registerAccessorProvider");
122+
return nullptr;
123+
}
120124
if (numInstances == 0 || instances == nullptr) {
121125
ALOGE("No instances passed to ABinderRpc_registerAccessorProvider. numInstances: %zu",
122126
numInstances);
@@ -126,10 +130,6 @@ ABinderRpc_AccessorProvider* ABinderRpc_registerAccessorProvider(
126130
for (size_t i = 0; i < numInstances; i++) {
127131
instanceStrings.emplace(instances[i]);
128132
}
129-
// call the onDelete when the last reference of this goes away (when the
130-
// last reference to the generate std::function goes away).
131-
std::shared_ptr<OnDeleteProviderHolder> onDeleteHolder =
132-
std::make_shared<OnDeleteProviderHolder>(data, onDelete);
133133
android::RpcAccessorProvider generate = [provider,
134134
onDeleteHolder](const String16& name) -> sp<IBinder> {
135135
ABinderRpc_Accessor* accessor = provider(String8(name).c_str(), onDeleteHolder->mData);

libs/binder/ndk/include_platform/android/binder_rpc.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ typedef void (*ABinderRpc_AccessorProviderUserData_deleteCallback)(void* _Nullab
139139
* registered. In the error case of duplicate instances, if data was
140140
* provided with a ABinderRpc_AccessorProviderUserData_deleteCallback,
141141
* the callback will be called to delete the data.
142+
* If nullptr is returned, ABinderRpc_AccessorProviderUserData_deleteCallback
143+
* will be called on data immediately.
142144
* Otherwise returns a pointer to the ABinderRpc_AccessorProvider that
143145
* can be used to remove with ABinderRpc_unregisterAccessorProvider.
144146
*/

libs/binder/tests/binderRpcTest.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1400,6 +1400,26 @@ TEST_F(BinderARpcNdk, ARpcProviderNewDelete) {
14001400
EXPECT_TRUE(isDeleted);
14011401
}
14021402

1403+
TEST_F(BinderARpcNdk, ARpcProviderDeleteOnError) {
1404+
bool isDeleted = false;
1405+
AccessorProviderData* data = new AccessorProviderData{{}, 0, &isDeleted};
1406+
1407+
ABinderRpc_AccessorProvider* provider =
1408+
ABinderRpc_registerAccessorProvider(getAccessor, kARpcSupportedServices, 0, data,
1409+
accessorProviderDataOnDelete);
1410+
1411+
ASSERT_EQ(provider, nullptr);
1412+
EXPECT_TRUE(isDeleted);
1413+
}
1414+
1415+
TEST_F(BinderARpcNdk, ARpcProvideOnErrorNoDeleteCbNoCrash) {
1416+
ABinderRpc_AccessorProvider* provider =
1417+
ABinderRpc_registerAccessorProvider(getAccessor, kARpcSupportedServices, 0, nullptr,
1418+
nullptr);
1419+
1420+
ASSERT_EQ(provider, nullptr);
1421+
}
1422+
14031423
TEST_F(BinderARpcNdk, ARpcProviderDuplicateInstance) {
14041424
const char* instance = "some.instance.name.IFoo/default";
14051425
const uint32_t numInstances = 2;

0 commit comments

Comments
 (0)