]> 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:33:43 +0000 (18:33 -0600)
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 478a2581e0835ee144d19c9d248235ff34e013d1..ca4d71e5b30221e90152b2719cae611ee98b7b23 100644 (file)
@@ -502,6 +502,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 f81f647b1f81631e9ba6397501c18cbd19a65a7f..9064e7bec97d41765823ce5073f498834d4ab13b 100644 (file)
@@ -1223,6 +1223,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 305e70f0d204ca7caf626916e6040e481f6f66e2..2f524fa57a851c05cc959c3249ad879646f06c6a 100644 (file)
@@ -1549,6 +1549,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 64acfa951b58cf6691ef7124a11fa8608bec3afa..e03a49423d43f7ba8a417dd67061c096c2e81a93 100644 (file)
@@ -2853,6 +2853,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 678e40c7147b9113659c6f8a4a16d0e2935bd938..666327ff9c6672774dbdff9c5ed485d27d28f5f5 100644 (file)
@@ -333,6 +333,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 eee1c84b81164b5e12e4c7719a75f705106189a0..34ecfdb0a153a9e1bd951cafc2f6aef2de960b86 100644 (file)
@@ -457,6 +457,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 42862b6dc03255d6d7fb47dac55a639548336030..add25867eda5a6eaa02b5f281635f0304d4cd561 100644 (file)
@@ -432,28 +432,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 2f6e752123b24a610b584b38ad22667a9d612112..a92dccb39fb3eaf89f42f5f0723f5ff26af72669 100644 (file)
@@ -339,6 +339,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 2329bb0c21ec2a85db060b20eba6febd94540760..e65d55cd7a079072901f98bc29ff80de7c439e65 100644 (file)
@@ -291,6 +291,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 4d8bc6f9bdcc1c9972249cdd61c7bfcc0894972c..230f836bcd282ae2009e7aecad06e4e3e12ab350 100644 (file)
@@ -875,6 +875,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 c4a5837715cc7f46147703d6694181658ac9bca9..97249738e89a2e64a1f5697348edc20253b260cd 100644 (file)
@@ -221,6 +221,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 883f1fdca64dd52e7252bf49c251e134691f1b1a..00c0f79b70eaa9f629cfc883f58363f8d28b4e23 100644 (file)
@@ -275,36 +275,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) {