From 9a28531362d747fd9dd987ad8328fc7917e7995e Mon Sep 17 00:00:00 2001 From: Matthew Fredrickson Date: Mon, 21 Aug 2023 11:02:57 -0500 Subject: [PATCH] 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 --- apps/app_macro.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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); }