From 060507196e85a32addba23eab22f698b1a131f95 Mon Sep 17 00:00:00 2001 From: Peiwei Hu Date: Fri, 19 Dec 2025 14:02:36 +0800 Subject: [PATCH] Clarify the ownership of the parameters of rz_search_collection_new (#5640) --- librz/search/collection.c | 15 +++++++++------ librz/search/search_internal.h | 4 ++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/librz/search/collection.c b/librz/search/collection.c index 0c6831c661..4a93669dca 100644 --- a/librz/search/collection.c +++ b/librz/search/collection.c @@ -5,17 +5,20 @@ #include #include "search_internal.h" -static RZ_OWN RzSearchCollection *rz_search_collection_new(RzSearchSpace space, RZ_NONNULL void *find, RZ_NONNULL RzSearchIsEmptyCallback is_empty, RZ_NULLABLE RzSearchFreeCallback free, RZ_NULLABLE void *user) { +static RZ_OWN RzSearchCollection *rz_search_collection_new(RzSearchSpace space, RZ_NONNULL void *find, RZ_NONNULL RzSearchIsEmptyCallback is_empty, RZ_NULLABLE RzSearchFreeCallback free_user, RZ_OWN RZ_NULLABLE void *user) { rz_return_val_if_fail(find && is_empty, NULL); RzSearchCollection *sc = RZ_NEW0(RzSearchCollection); if (!sc) { + if (free_user && user) { + free_user(user); + } RZ_LOG_ERROR("search: failed to allocate RzSearchCollection\n"); return NULL; } sc->space = space; sc->find = find; sc->is_empty = is_empty; - sc->free = free; + sc->free = free_user; sc->user = user; return sc; } @@ -30,9 +33,9 @@ static RZ_OWN RzSearchCollection *rz_search_collection_new(RzSearchSpace space, * * \return On success returns a valid pointer, otherwise NULL. */ -RZ_IPI RZ_OWN RzSearchCollection *rz_search_collection_new_graph_space(RZ_NONNULL RzSearchFindGraphCallback find, RZ_NONNULL RzSearchIsEmptyCallback is_empty, RZ_NULLABLE RzSearchFreeCallback free, RZ_NULLABLE void *user) { +RZ_IPI RZ_OWN RzSearchCollection *rz_search_collection_new_graph_space(RZ_NONNULL RzSearchFindGraphCallback find, RZ_NONNULL RzSearchIsEmptyCallback is_empty, RZ_NULLABLE RzSearchFreeCallback free_user, RZ_OWN RZ_NULLABLE void *user) { rz_return_val_if_fail(find && is_empty, NULL); - return rz_search_collection_new(RZ_SEARCH_SPACE_GRAPH, find, is_empty, free, user); + return rz_search_collection_new(RZ_SEARCH_SPACE_GRAPH, find, is_empty, free_user, user); } /** @@ -45,9 +48,9 @@ RZ_IPI RZ_OWN RzSearchCollection *rz_search_collection_new_graph_space(RZ_NONNUL * * \return On success returns a valid pointer, otherwise NULL. */ -RZ_IPI RZ_OWN RzSearchCollection *rz_search_collection_new_bytes_space(RZ_NONNULL RzSearchFindBytesCallback find, RZ_NONNULL RzSearchIsEmptyCallback is_empty, RZ_NULLABLE RzSearchFreeCallback free, RZ_NULLABLE void *user) { +RZ_IPI RZ_OWN RzSearchCollection *rz_search_collection_new_bytes_space(RZ_NONNULL RzSearchFindBytesCallback find, RZ_NONNULL RzSearchIsEmptyCallback is_empty, RZ_NULLABLE RzSearchFreeCallback free_user, RZ_OWN RZ_NULLABLE void *user) { rz_return_val_if_fail(find && is_empty, NULL); - return rz_search_collection_new(RZ_SEARCH_SPACE_BYTES, find, is_empty, free, user); + return rz_search_collection_new(RZ_SEARCH_SPACE_BYTES, find, is_empty, free_user, user); } /** diff --git a/librz/search/search_internal.h b/librz/search/search_internal.h index e3bc08add7..bb81350031 100644 --- a/librz/search/search_internal.h +++ b/librz/search/search_internal.h @@ -174,8 +174,8 @@ RZ_IPI int rz_search_hit_cmp(RZ_NULLABLE RzSearchHit *a, RZ_NULLABLE RzSearchHit RZ_IPI RZ_OWN RzSearchInterval *rz_search_interval_new(RzInterval interval, size_t n_hits); RZ_IPI void rz_search_interval_free(RZ_NULLABLE RzSearchInterval *interval); -RZ_IPI RZ_OWN RzSearchCollection *rz_search_collection_new_bytes_space(RZ_NONNULL RzSearchFindBytesCallback find, RZ_NONNULL RzSearchIsEmptyCallback is_empty, RZ_NULLABLE RzSearchFreeCallback free, RZ_NULLABLE void *user); -RZ_IPI RZ_OWN RzSearchCollection *rz_search_collection_new_graph_space(RZ_NONNULL RzSearchFindGraphCallback find, RZ_NONNULL RzSearchIsEmptyCallback is_empty, RZ_NULLABLE RzSearchFreeCallback free, RZ_NULLABLE void *user); +RZ_IPI RZ_OWN RzSearchCollection *rz_search_collection_new_bytes_space(RZ_NONNULL RzSearchFindBytesCallback find, RZ_NONNULL RzSearchIsEmptyCallback is_empty, RZ_NULLABLE RzSearchFreeCallback free_user, RZ_OWN RZ_NULLABLE void *user); +RZ_IPI RZ_OWN RzSearchCollection *rz_search_collection_new_graph_space(RZ_NONNULL RzSearchFindGraphCallback find, RZ_NONNULL RzSearchIsEmptyCallback is_empty, RZ_NULLABLE RzSearchFreeCallback free_user, RZ_OWN RZ_NULLABLE void *user); RZ_IPI bool rz_search_collection_has_find_callback(RZ_NONNULL RzSearchCollection *col, RZ_NONNULL void *expected); RZ_IPI bool rz_search_collection_is_empty(RZ_NONNULL RzSearchCollection *col); RZ_IPI static inline bool rz_search_collection_on_bytes_space(RZ_NONNULL RzSearchCollection *col) {