res_ari: Add "module loaded" check to ari stubs
authorGeorge Joseph <gjoseph@digium.com>
Tue, 13 Jun 2017 16:33:34 +0000 (10:33 -0600)
committerGeorge Joseph <gjoseph@digium.com>
Fri, 16 Jun 2017 00:34:03 +0000 (19:34 -0500)
The recent change to make the use of LOAD_DECLINE more consistent
caused res_ari to unload itself before declining if the ari.conf
file wasn't found.  The ari stubs though still tried to use the
configuration resulting in segfaults.

This patch creates a new CHECK_ARI_MODULE_LOADED macro which tests
to see if res_ari is actually loaded and causes the stubs to also
decline if it isn't.  The macro was then added to the mustache
template's "load_module" function.

ASTERISK-27026 #close
Reported-by: Ronald Raikes

Change-Id: I263d56efa628ee3c411bdcd16d49af6260c6c91d

13 files changed:
include/asterisk/ari.h
res/res_ari_applications.c
res/res_ari_asterisk.c
res/res_ari_bridges.c
res/res_ari_channels.c
res/res_ari_device_states.c
res/res_ari_endpoints.c
res/res_ari_events.c
res/res_ari_mailboxes.c
res/res_ari_playbacks.c
res/res_ari_recordings.c
res/res_ari_sounds.c
rest-api-templates/res_ari_resource.c.mustache

index 865b4b0..f83d596 100644 (file)
@@ -268,4 +268,14 @@ void ast_ari_response_created(struct ast_ari_response *response,
  */
 void ast_ari_response_alloc_failed(struct ast_ari_response *response);
 
+/*! \brief Determines whether the res_ari module is loaded */
+#define CHECK_ARI_MODULE_LOADED()                              \
+       do {                                                    \
+               if (!ast_module_check("res_ari.so")             \
+                       || !ast_ari_oom_json()) {       \
+                       return AST_MODULE_LOAD_DECLINE;         \
+               }                                               \
+       } while(0)
+
+
 #endif /* _ASTERISK_ARI_H */
index 21d9f56..cf700c4 100644 (file)
@@ -500,6 +500,10 @@ static int unload_module(void)
 static int load_module(void)
 {
        int res = 0;
+
+       CHECK_ARI_MODULE_LOADED();
+
+
        stasis_app_ref();
        res |= ast_ari_add_handler(&applications);
        if (res) {
index 89517cc..eb0617b 100644 (file)
@@ -1221,6 +1221,10 @@ static int unload_module(void)
 static int load_module(void)
 {
        int res = 0;
+
+       CHECK_ARI_MODULE_LOADED();
+
+
        stasis_app_ref();
        res |= ast_ari_add_handler(&asterisk);
        if (res) {
index 5402c2b..65bf7ed 100644 (file)
@@ -1547,6 +1547,10 @@ static int unload_module(void)
 static int load_module(void)
 {
        int res = 0;
+
+       CHECK_ARI_MODULE_LOADED();
+
+
        stasis_app_ref();
        res |= ast_ari_add_handler(&bridges);
        if (res) {
index 9d218e2..f6befcc 100644 (file)
@@ -2851,6 +2851,10 @@ static int unload_module(void)
 static int load_module(void)
 {
        int res = 0;
+
+       CHECK_ARI_MODULE_LOADED();
+
+
        stasis_app_ref();
        res |= ast_ari_add_handler(&channels);
        if (res) {
index d6de5df..f393935 100644 (file)
@@ -331,6 +331,10 @@ static int unload_module(void)
 static int load_module(void)
 {
        int res = 0;
+
+       CHECK_ARI_MODULE_LOADED();
+
+
        stasis_app_ref();
        res |= ast_ari_add_handler(&deviceStates);
        if (res) {
index d96de08..d1242c0 100644 (file)
@@ -455,6 +455,10 @@ static int unload_module(void)
 static int load_module(void)
 {
        int res = 0;
+
+       CHECK_ARI_MODULE_LOADED();
+
+
        stasis_app_ref();
        res |= ast_ari_add_handler(&endpoints);
        if (res) {
index 3f5b89a..f916d0e 100644 (file)
@@ -430,28 +430,35 @@ static int unload_module(void)
 static int load_module(void)
 {
        int res = 0;
-       struct ast_websocket_protocol *protocol;
 
-       if (ast_ari_websocket_events_event_websocket_init() == -1) {
-               return AST_MODULE_LOAD_DECLINE;
-       }
+       CHECK_ARI_MODULE_LOADED();
 
-       events.ws_server = ast_websocket_server_create();
-       if (!events.ws_server) {
-               ast_ari_websocket_events_event_websocket_dtor();
-               return AST_MODULE_LOAD_DECLINE;
-       }
+       /* This is scoped to not conflict with CHECK_ARI_MODULE_LOADED */
+       {
+               struct ast_websocket_protocol *protocol;
 
-       protocol = ast_websocket_sub_protocol_alloc("ari");
-       if (!protocol) {
-               ao2_ref(events.ws_server, -1);
-               events.ws_server = NULL;
-               ast_ari_websocket_events_event_websocket_dtor();
-               return AST_MODULE_LOAD_DECLINE;
+               if (ast_ari_websocket_events_event_websocket_init() == -1) {
+                       return AST_MODULE_LOAD_DECLINE;
+               }
+
+               events.ws_server = ast_websocket_server_create();
+               if (!events.ws_server) {
+                       ast_ari_websocket_events_event_websocket_dtor();
+                       return AST_MODULE_LOAD_DECLINE;
+               }
+
+               protocol = ast_websocket_sub_protocol_alloc("ari");
+               if (!protocol) {
+                       ao2_ref(events.ws_server, -1);
+                       events.ws_server = NULL;
+                       ast_ari_websocket_events_event_websocket_dtor();
+                       return AST_MODULE_LOAD_DECLINE;
+               }
+               protocol->session_attempted = ast_ari_events_event_websocket_ws_attempted_cb;
+               protocol->session_established = ast_ari_events_event_websocket_ws_established_cb;
+               res |= ast_websocket_server_add_protocol2(events.ws_server, protocol);
        }
-       protocol->session_attempted = ast_ari_events_event_websocket_ws_attempted_cb;
-       protocol->session_established = ast_ari_events_event_websocket_ws_established_cb;
-       res |= ast_websocket_server_add_protocol2(events.ws_server, protocol);
+
        stasis_app_ref();
        res |= ast_ari_add_handler(&events);
        if (res) {
index 12c33cd..1f6d2cc 100644 (file)
@@ -337,6 +337,10 @@ static int unload_module(void)
 static int load_module(void)
 {
        int res = 0;
+
+       CHECK_ARI_MODULE_LOADED();
+
+
        stasis_app_ref();
        res |= ast_ari_add_handler(&mailboxes);
        if (res) {
index e2c432d..40099cf 100644 (file)
@@ -289,6 +289,10 @@ static int unload_module(void)
 static int load_module(void)
 {
        int res = 0;
+
+       CHECK_ARI_MODULE_LOADED();
+
+
        stasis_app_ref();
        res |= ast_ari_add_handler(&playbacks);
        if (res) {
index 57d80f2..fe3d343 100644 (file)
@@ -873,6 +873,10 @@ static int unload_module(void)
 static int load_module(void)
 {
        int res = 0;
+
+       CHECK_ARI_MODULE_LOADED();
+
+
        stasis_app_ref();
        res |= ast_ari_add_handler(&recordings);
        if (res) {
index fded7fb..8d5928a 100644 (file)
@@ -219,6 +219,10 @@ static int unload_module(void)
 static int load_module(void)
 {
        int res = 0;
+
+       CHECK_ARI_MODULE_LOADED();
+
+
        stasis_app_ref();
        res |= ast_ari_add_handler(&sounds);
        if (res) {
index 3ccafcd..d4ccda9 100644 (file)
@@ -273,36 +273,43 @@ static int unload_module(void)
 static int load_module(void)
 {
        int res = 0;
+
+       CHECK_ARI_MODULE_LOADED();
+
 {{#apis}}
 {{#operations}}
 {{#has_websocket}}
-       struct ast_websocket_protocol *protocol;
+       /* This is scoped to not conflict with CHECK_ARI_MODULE_LOADED */
+       {
+               struct ast_websocket_protocol *protocol;
 
-       if (ast_ari_websocket_{{c_name}}_{{c_nickname}}_init() == -1) {
-               return AST_MODULE_LOAD_DECLINE;
-       }
+               if (ast_ari_websocket_{{c_name}}_{{c_nickname}}_init() == -1) {
+                       return AST_MODULE_LOAD_DECLINE;
+               }
 
-       {{full_name}}.ws_server = ast_websocket_server_create();
-       if (!{{full_name}}.ws_server) {
-               ast_ari_websocket_events_event_websocket_dtor();
-               return AST_MODULE_LOAD_DECLINE;
-       }
+               {{full_name}}.ws_server = ast_websocket_server_create();
+               if (!{{full_name}}.ws_server) {
+                       ast_ari_websocket_events_event_websocket_dtor();
+                       return AST_MODULE_LOAD_DECLINE;
+               }
 
-       protocol = ast_websocket_sub_protocol_alloc("{{websocket_protocol}}");
-       if (!protocol) {
-               ao2_ref({{full_name}}.ws_server, -1);
-               {{full_name}}.ws_server = NULL;
-               ast_ari_websocket_events_event_websocket_dtor();
-               return AST_MODULE_LOAD_DECLINE;
-       }
-       protocol->session_attempted = ast_ari_{{c_name}}_{{c_nickname}}_ws_attempted_cb;
-       protocol->session_established = ast_ari_{{c_name}}_{{c_nickname}}_ws_established_cb;
+               protocol = ast_websocket_sub_protocol_alloc("{{websocket_protocol}}");
+               if (!protocol) {
+                       ao2_ref({{full_name}}.ws_server, -1);
+                       {{full_name}}.ws_server = NULL;
+                       ast_ari_websocket_events_event_websocket_dtor();
+                       return AST_MODULE_LOAD_DECLINE;
+               }
+               protocol->session_attempted = ast_ari_{{c_name}}_{{c_nickname}}_ws_attempted_cb;
+               protocol->session_established = ast_ari_{{c_name}}_{{c_nickname}}_ws_established_cb;
 {{/has_websocket}}
 {{#is_websocket}}
-       res |= ast_websocket_server_add_protocol2({{full_name}}.ws_server, protocol);
+               res |= ast_websocket_server_add_protocol2({{full_name}}.ws_server, protocol);
+       }
 {{/is_websocket}}
 {{/operations}}
 {{/apis}}
+
        stasis_app_ref();
        res |= ast_ari_add_handler(&{{root_full_name}});
        if (res) {