]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Dialplan functions: Fix some channel autoservice misuse.
authorRichard Mudgett <rmudgett@digium.com>
Mon, 18 Jun 2018 21:07:47 +0000 (16:07 -0500)
committerRichard Mudgett <rmudgett@digium.com>
Tue, 19 Jun 2018 16:49:24 +0000 (11:49 -0500)
* Fix off nominal paths leaving the channel in autoservice.
* Remove unnecessary start/stop channel autoservice.
* Fix channel locking around a channel datastore search.

Change-Id: I7ff2e42388064fe3149034ecae57604040b8b540

funcs/func_curl.c
funcs/func_realtime.c
main/enum.c

index b1bb7596458a131b30357f4a778328aaa6e91c65..89a4688e7aa226dff2f823b7084cf0fbcc3b55db 100644 (file)
@@ -636,16 +636,16 @@ static int acf_curl_helper(struct ast_channel *chan, const char *cmd, char *info
                return -1;
        }
 
-       if (chan) {
-               ast_autoservice_start(chan);
-       }
-
        if (!(curl = ast_threadstorage_get(&curl_instance, sizeof(*curl)))) {
                ast_log(LOG_ERROR, "Cannot allocate curl structure\n");
                ast_free(str);
                return -1;
        }
 
+       if (chan) {
+               ast_autoservice_start(chan);
+       }
+
        AST_LIST_LOCK(&global_curl_info);
        AST_LIST_TRAVERSE(&global_curl_info, cur, list) {
                if (cur->key == CURLOPT_SPECIAL_HASHCOMPAT) {
@@ -656,14 +656,19 @@ static int acf_curl_helper(struct ast_channel *chan, const char *cmd, char *info
        }
        AST_LIST_UNLOCK(&global_curl_info);
 
-       if (chan && (store = ast_channel_datastore_find(chan, &curl_info, NULL))) {
-               list = store->data;
-               AST_LIST_LOCK(list);
-               AST_LIST_TRAVERSE(list, cur, list) {
-                       if (cur->key == CURLOPT_SPECIAL_HASHCOMPAT) {
-                               hashcompat = (long) cur->value;
-                       } else {
-                               curl_easy_setopt(*curl, cur->key, cur->value);
+       if (chan) {
+               ast_channel_lock(chan);
+               store = ast_channel_datastore_find(chan, &curl_info, NULL);
+               ast_channel_unlock(chan);
+               if (store) {
+                       list = store->data;
+                       AST_LIST_LOCK(list);
+                       AST_LIST_TRAVERSE(list, cur, list) {
+                               if (cur->key == CURLOPT_SPECIAL_HASHCOMPAT) {
+                                       hashcompat = (long) cur->value;
+                               } else {
+                                       curl_easy_setopt(*curl, cur->key, cur->value);
+                               }
                        }
                }
        }
index a870ab450875c6667700f91f46e9dbe4bbcd2d9d..2fc4df8175075f80aa73f191f44d102f2e1ea1e2 100644 (file)
@@ -227,6 +227,9 @@ static int function_realtime_read(struct ast_channel *chan, const char *cmd, cha
 
        if (resultslen > len) {
                ast_log(LOG_WARNING, "Failed to fetch. Realtime data is too large: need %zu, have %zu.\n", resultslen, len);
+               if (chan) {
+                       ast_autoservice_stop(chan);
+               }
                return -1;
        }
 
@@ -460,6 +463,9 @@ static int function_realtime_readdestroy(struct ast_channel *chan, const char *c
                         * someones data without giving him the chance to look
                         * at it. */
                        ast_log(LOG_WARNING, "Failed to fetch/destroy. Realtime data is too large: need %zu, have %zu.\n", resultslen, len);
+                       if (chan) {
+                               ast_autoservice_stop(chan);
+                       }
                        return -1;
                }
 
index bae12996565c7e47f32b2d035c9579fffdbeee68..e003f0781956c5a0bae2c61d56bb4ab5fbd28ee0 100644 (file)
@@ -942,10 +942,6 @@ int ast_get_txt(struct ast_channel *chan, const char *number, char *txt, int txt
 
        ast_debug(4, "ast_get_txt: Number = '%s', suffix = '%s'\n", number, suffix);
 
-       if (chan && ast_autoservice_start(chan) < 0) {
-               return -1;
-       }
-
        if (pos > 128) {
                pos = 128;
        }
@@ -966,9 +962,6 @@ int ast_get_txt(struct ast_channel *chan, const char *number, char *txt, int txt
        } else {
                ast_copy_string(txt, context.txt, txtlen);
        }
-       if (chan) {
-               ret |= ast_autoservice_stop(chan);
-       }
        return ret;
 }