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
This commit is contained in:
Matthew Fredrickson 2023-08-21 11:02:57 -05:00 committed by asterisk-org-access-app[bot]
parent c8f2698ec6
commit 9a28531362
1 changed files with 5 additions and 2 deletions

View File

@ -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, &macro_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, &macro_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);
}