diff --git a/funcs/func_curl.c b/funcs/func_curl.c
index b1bb759645..89a4688e7a 100644
--- a/funcs/func_curl.c
+++ b/funcs/func_curl.c
@@ -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);
+				}
 			}
 		}
 	}
diff --git a/funcs/func_realtime.c b/funcs/func_realtime.c
index a870ab4508..2fc4df8175 100644
--- a/funcs/func_realtime.c
+++ b/funcs/func_realtime.c
@@ -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;
 		}
 
diff --git a/main/enum.c b/main/enum.c
index bae1299656..e003f07819 100644
--- a/main/enum.c
+++ b/main/enum.c
@@ -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;
 }