Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 20f9ecf0 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Delete user data even on error when registering AccessorProviders" into...

Merge "Delete user data even on error when registering AccessorProviders" into main am: d3525e41 am: 73fc4104

Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/3363328



Change-Id: Iba345f1275a6cf2ef72005334a34bf1219eead62
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents f46d45be 73fc4104
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -107,16 +107,20 @@ ABinderRpc_AccessorProvider* ABinderRpc_registerAccessorProvider(
        ABinderRpc_AccessorProvider_getAccessorCallback provider,
        const char* const* const instances, size_t numInstances, void* data,
        ABinderRpc_AccessorProviderUserData_deleteCallback onDelete) {
    if (provider == nullptr) {
        ALOGE("Null provider passed to ABinderRpc_registerAccessorProvider");
        return nullptr;
    }
    if (data && onDelete == nullptr) {
        ALOGE("If a non-null data ptr is passed to ABinderRpc_registerAccessorProvider, then a "
              "ABinderRpc_AccessorProviderUserData_deleteCallback must also be passed to delete "
              "the data object once the ABinderRpc_AccessorProvider is removed.");
        return nullptr;
    }
    // call the onDelete when the last reference of this goes away (when the
    // last reference to the generate std::function goes away).
    std::shared_ptr<OnDeleteProviderHolder> onDeleteHolder =
            std::make_shared<OnDeleteProviderHolder>(data, onDelete);
    if (provider == nullptr) {
        ALOGE("Null provider passed to ABinderRpc_registerAccessorProvider");
        return nullptr;
    }
    if (numInstances == 0 || instances == nullptr) {
        ALOGE("No instances passed to ABinderRpc_registerAccessorProvider. numInstances: %zu",
              numInstances);
@@ -126,10 +130,6 @@ ABinderRpc_AccessorProvider* ABinderRpc_registerAccessorProvider(
    for (size_t i = 0; i < numInstances; i++) {
        instanceStrings.emplace(instances[i]);
    }
    // call the onDelete when the last reference of this goes away (when the
    // last reference to the generate std::function goes away).
    std::shared_ptr<OnDeleteProviderHolder> onDeleteHolder =
            std::make_shared<OnDeleteProviderHolder>(data, onDelete);
    android::RpcAccessorProvider generate = [provider,
                                             onDeleteHolder](const String16& name) -> sp<IBinder> {
        ABinderRpc_Accessor* accessor = provider(String8(name).c_str(), onDeleteHolder->mData);
+2 −0
Original line number Diff line number Diff line
@@ -139,6 +139,8 @@ typedef void (*ABinderRpc_AccessorProviderUserData_deleteCallback)(void* _Nullab
 *         registered. In the error case of duplicate instances, if data was
 *         provided with a ABinderRpc_AccessorProviderUserData_deleteCallback,
 *         the callback will be called to delete the data.
 *         If nullptr is returned, ABinderRpc_AccessorProviderUserData_deleteCallback
 *         will be called on data immediately.
 *         Otherwise returns a pointer to the ABinderRpc_AccessorProvider that
 *         can be used to remove with ABinderRpc_unregisterAccessorProvider.
 */
+20 −0
Original line number Diff line number Diff line
@@ -1400,6 +1400,26 @@ TEST_F(BinderARpcNdk, ARpcProviderNewDelete) {
    EXPECT_TRUE(isDeleted);
}

TEST_F(BinderARpcNdk, ARpcProviderDeleteOnError) {
    bool isDeleted = false;
    AccessorProviderData* data = new AccessorProviderData{{}, 0, &isDeleted};

    ABinderRpc_AccessorProvider* provider =
            ABinderRpc_registerAccessorProvider(getAccessor, kARpcSupportedServices, 0, data,
                                                accessorProviderDataOnDelete);

    ASSERT_EQ(provider, nullptr);
    EXPECT_TRUE(isDeleted);
}

TEST_F(BinderARpcNdk, ARpcProvideOnErrorNoDeleteCbNoCrash) {
    ABinderRpc_AccessorProvider* provider =
            ABinderRpc_registerAccessorProvider(getAccessor, kARpcSupportedServices, 0, nullptr,
                                                nullptr);

    ASSERT_EQ(provider, nullptr);
}

TEST_F(BinderARpcNdk, ARpcProviderDuplicateInstance) {
    const char* instance = "some.instance.name.IFoo/default";
    const uint32_t numInstances = 2;