From 03eb6cbc10df61064fda2a3890d82ef04f3a0c6a Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Tue, 18 Aug 2015 15:07:49 -0500 Subject: [PATCH] res_ari_events: Fix shutdown ref leak. ASTERISK-25308 #close Reported by: Joshua Colp Change-Id: I592785bf70ff4b63d00e535b482f40da8e82a082 --- res/ari/resource_events.c | 19 ++++++++++++------- res/ari/resource_events.h | 7 +++++++ res/res_ari_events.c | 1 + rest-api-templates/ari_resource.h.mustache | 11 +++++++++++ 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/res/ari/resource_events.c b/res/ari/resource_events.c index f1342b7fae..deb7f9cc05 100644 --- a/res/ari/resource_events.c +++ b/res/ari/resource_events.c @@ -103,12 +103,12 @@ static void stasis_app_message_handler( msg_type, msg_application); } else if (!session->ws_session) { - /* If the websocket is NULL, the message goes to the queue */ - AST_VECTOR_APPEND(&session->message_queue, message); - ast_log(LOG_WARNING, - "Queued '%s' message for Stasis app '%s'; websocket is not ready\n", - msg_type, - msg_application); + /* If the websocket is NULL, the message goes to the queue */ + AST_VECTOR_APPEND(&session->message_queue, message); + ast_log(LOG_WARNING, + "Queued '%s' message for Stasis app '%s'; websocket is not ready\n", + msg_type, + msg_application); } else { /* We are ready to publish the message */ ast_ari_websocket_session_write(session->ws_session, message); @@ -426,13 +426,18 @@ static int event_session_alloc(struct ast_tcptls_session_instance *ser, return 0; } +void ast_ari_websocket_events_event_websocket_dtor(void) +{ + ao2_cleanup(event_session_registry); + event_session_registry = NULL; +} + int ast_ari_websocket_events_event_websocket_init(void) { /* Try to instantiate the registry */ event_session_registry = ao2_container_alloc(EVENT_SESSION_NUM_BUCKETS, event_session_hash, event_session_compare); - if (!event_session_registry) { /* This is bad, bad. */ ast_log(LOG_WARNING, diff --git a/res/ari/resource_events.h b/res/ari/resource_events.h index bc763ebd38..aa1e3dfd64 100644 --- a/res/ari/resource_events.h +++ b/res/ari/resource_events.h @@ -57,6 +57,13 @@ struct ast_ari_events_event_websocket_args { */ int ast_ari_websocket_events_event_websocket_init(void); +/*! + * \brief WebSocket connection for events. + * + * \return Nothing + */ +void ast_ari_websocket_events_event_websocket_dtor(void); + /*! * \brief WebSocket connection for events. * diff --git a/res/res_ari_events.c b/res/res_ari_events.c index bf33aeaff2..4b2b151aa0 100644 --- a/res/res_ari_events.c +++ b/res/res_ari_events.c @@ -462,6 +462,7 @@ static int unload_module(void) ast_ari_remove_handler(&events); ao2_cleanup(events.ws_server); events.ws_server = NULL; + ast_ari_websocket_events_event_websocket_dtor(); stasis_app_unref(); return 0; } diff --git a/rest-api-templates/ari_resource.h.mustache b/rest-api-templates/ari_resource.h.mustache index f28e832d18..5e06af734f 100644 --- a/rest-api-templates/ari_resource.h.mustache +++ b/rest-api-templates/ari_resource.h.mustache @@ -102,6 +102,17 @@ void ast_ari_{{c_name}}_{{c_nickname}}(struct ast_variable *headers, struct ast_ */ int ast_ari_websocket_{{c_name}}_{{c_nickname}}_init(void); +/*! + * \brief {{summary}} +{{#notes}} + * + * {{{notes}}} +{{/notes}} + * + * \return Nothing + */ +void ast_ari_websocket_{{c_name}}_{{c_nickname}}_dtor(void); + /*! * \brief {{summary}} {{#notes}}