diff --git a/include/asterisk/stasis.h b/include/asterisk/stasis.h index 8e9c6c7be9b293eaa6518999866f496625f50e30..275dc1e174e07ac44c4a1c8e893c5a1390f5a1ac 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 + * <pool_topic_name>/<topic_name> or just <topic_name> * * \since 13.24 * \since 15.6 diff --git a/main/stasis.c b/main/stasis.c index 9d7c11fe5474636b86778c0991d9c41bccb25e96..67ed9a60b075173b6b75781c9bd1d139db8c5f81 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 <pool_topic_name>/<topic_name> + * or just <topic_name>. If it's fully qualified, we need to skip past <pool_topic_name> + * name and search only on <topic_name>. + */ + 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)