From: Matthew Fredrickson Date: Mon, 21 Aug 2023 16:02:57 +0000 (-0500) Subject: app_macro: Fix locking around datastore access X-Git-Tag: 18.20.0-rc1~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9cec96a04c15ecb63b28499cdc77f3421fba0c0f;p=thirdparty%2Fasterisk.git app_macro: Fix locking around datastore access app_macro sometimes would crash due to datastore list corruption on the channel because of lack of locking around find and create process for the macro datastore. This patch locks the channel lock prior to protect against this problem. Resolves: #265 (cherry picked from commit ec4e0340ceb5bf459770280d1d1f4580ecb0df86) --- diff --git a/apps/app_macro.c b/apps/app_macro.c index b426cf8f69..565af5546e 100644 --- a/apps/app_macro.c +++ b/apps/app_macro.c @@ -262,7 +262,7 @@ static int _macro_exec(struct ast_channel *chan, const char *data, int exclusive char *save_macro_priority; char *save_macro_offset; int save_in_subroutine; - struct ast_datastore *macro_store = ast_channel_datastore_find(chan, ¯o_ds_info, NULL); + struct ast_datastore *macro_store; int had_infinite_include_error = 0; static int deprecation_notice = 0; @@ -277,6 +277,10 @@ static int _macro_exec(struct ast_channel *chan, const char *data, int exclusive ast_log(LOG_WARNING, "Dialplan should be updated to use Gosub instead.\n"); } + ast_channel_lock(chan); + + macro_store = ast_channel_datastore_find(chan, ¯o_ds_info, NULL); + do { if (macro_store) { break; @@ -291,7 +295,6 @@ static int _macro_exec(struct ast_channel *chan, const char *data, int exclusive } while (0); /* does the user want a deeper rabbit hole? */ - ast_channel_lock(chan); if ((s = pbx_builtin_getvar_helper(chan, "MACRO_RECURSION"))) { sscanf(s, "%30d", &maxdepth); }