From 1c9ddad4db326ad04e86bd17ef8b5d1fe5a8006d Mon Sep 17 00:00:00 2001 From: George Joseph Date: Thu, 2 Jan 2020 13:25:33 -0700 Subject: [PATCH] stasis.c: Use correct topic name in stasis_topic_pool_delete_topic When a topic is created for an object, its name is only : For example: bridge:cb68b3a8-fce7-4738-8a17-d7847562f020 When a topic is added to a pool, its name has the pool's topic name prepended. For example: bridge:all/bridge:cb68b3a8-fce7-4738-8a17-d7847562f020 The topic_pool_entry's name however, is only what was passed in to stasis_topic_pool_get_topic which is bridge:cb68b3a8-fce7-4738-8a17-d7847562f020 That's actually correct because the entry is qualified by the pool that's in. When you're ready to delete the entry from the pool, you retrieve the tropic name from the object but since it now has the pool's topic name prepended, it won't be found in the pool container. Fix: * Modified stasis_topic_pool_delete_topic() to skip past the pool topic's name, if it was prepended to the topic name, before searching the container for a pool entry. ASTERISK-28633 Reported by: Joeran Vinzens Change-Id: I4396aa69dd83e4ab84c5b91b39293cfdbcf483e6 --- include/asterisk/stasis.h | 3 ++- main/stasis.c | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/include/asterisk/stasis.h b/include/asterisk/stasis.h index 8e9c6c7be9..275dc1e174 100644 --- a/include/asterisk/stasis.h +++ b/include/asterisk/stasis.h @@ -930,7 +930,8 @@ struct stasis_topic *stasis_topic_pool_get_topic(struct stasis_topic_pool *pool, * \brief Delete a topic from the topic pool * * \param pool Pool from which to delete the topic - * \param topic_name Name of the topic to delete + * \param topic_name Name of the topic to delete in the form of + * / or just * * \since 13.24 * \since 15.6 diff --git a/main/stasis.c b/main/stasis.c index 9d7c11fe54..67ed9a60b0 100644 --- a/main/stasis.c +++ b/main/stasis.c @@ -1855,7 +1855,22 @@ struct stasis_topic_pool *stasis_topic_pool_create(struct stasis_topic *pooled_t void stasis_topic_pool_delete_topic(struct stasis_topic_pool *pool, const char *topic_name) { - ao2_find(pool->pool_container, topic_name, OBJ_SEARCH_KEY | OBJ_NODATA | OBJ_UNLINK); + /* + * The topic_name passed in could be a fully-qualified name like / + * or just . If it's fully qualified, we need to skip past + * name and search only on . + */ + const char *pool_topic_name = stasis_topic_name(pool->pool_topic); + int pool_topic_name_len = strlen(pool_topic_name); + const char *search_topic_name; + + if (strncmp(pool_topic_name, topic_name, pool_topic_name_len) == 0) { + search_topic_name = topic_name + pool_topic_name_len + 1; + } else { + search_topic_name = topic_name; + } + + ao2_find(pool->pool_container, search_topic_name, OBJ_SEARCH_KEY | OBJ_NODATA | OBJ_UNLINK); } struct stasis_topic *stasis_topic_pool_get_topic(struct stasis_topic_pool *pool, const char *topic_name)