From: Richard Mudgett Date: Mon, 18 Jun 2018 21:07:47 +0000 (-0500) Subject: Dialplan functions: Fix some channel autoservice misuse. X-Git-Tag: 15.5.0-rc1~26^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=84fa1b9c36f5e5aa516a93afdf5d93e1a15e1916;p=thirdparty%2Fasterisk.git Dialplan functions: Fix some channel autoservice misuse. * 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 --- diff --git a/funcs/func_curl.c b/funcs/func_curl.c index ebb3dce23c..caf3c9274f 100644 --- a/funcs/func_curl.c +++ b/funcs/func_curl.c @@ -672,14 +672,19 @@ static int acf_curl_helper(struct ast_channel *chan, struct curl_args *args) } 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); + } } } } diff --git a/funcs/func_realtime.c b/funcs/func_realtime.c index e0ba4a5a18..ef7fe2a5ef 100644 --- a/funcs/func_realtime.c +++ b/funcs/func_realtime.c @@ -225,6 +225,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; } @@ -458,6 +461,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; } diff --git a/main/enum.c b/main/enum.c index 5c217c43ca..008cc883ca 100644 --- a/main/enum.c +++ b/main/enum.c @@ -940,10 +940,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; } @@ -964,9 +960,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; }