]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
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 865b4b00cc5d794dd3c49edd42ad4f52230fca0f..f83d5963f322419200f33154dc0cc4bd6982fb19 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 21d9f56eb0003865e267aa89134e6776286f1851..cf700c464e0cb4b0d21fc608fce8ff33333ef1ea 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 89517ccae0c6d537c71ec04818fd21eb35b23f7a..eb0617b4c7081464219cd9e4d271317ede83dad7 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 5402c2b995e13f8404fdb579904ab68b7af35dfb..65bf7ed3e73c8276cb9e238b6e658f1323f97bb0 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 9d218e2beefb360832e7e9a7d549e1cba14fb749..f6befcc90d4a036bdd643586684db4ceae6cd825 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 d6de5dff86919990c1fc4db6ea46960bb7121194..f393935626581035a6fc39268eeb840d92f2ab69 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 d96de0877bf10751826eca60c2f5c5e02a4e7db5..d1242c0fbc0e05e0d68d2fe6bc4d6bdd88ecb15e 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 3f5b89a440ee527e222a6f91ed4f44af1f7c97dc..f916d0e4eedba8c8c3bc4305ff9c473fa94869fb 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 12c33cd8847ba092f33755f1b9abed87e8011f99..1f6d2cc81b97a838ff62e43b4b7091cfb2741e69 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 e2c432db031ddc393340c21a55594bd86a122299..40099cfb4882253aaff8f12635acb3ae837a35bd 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 57d80f2e0fea78fc9d6dfecdd23c24a3836d7d6f..fe3d343ee2acac875ae87ff92bca2b6bdcf0c6c4 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 fded7fbced53013a62022cf912ad29acde55d961..8d5928a504b6e4772bf98a9af3f83b2105f850da 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 3ccafcd082b8c3b39b8724a1c9b6f9682360d716..d4ccda9e8eadb96fa174dd05b5dfe8bae092f9a9 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) {