Skip to content

Commit d3525e4

Browse files
Treehugger RobotGerrit Code Review
authored andcommitted
Merge "Delete user data even on error when registering AccessorProviders" into main
2 parents c0decbc + 5fd2247 commit d3525e4

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)