Merge "pbx.c: Prevent infinite recursion in manager_show_dialplan_helper."

changes/65/3765/1
zuul 9 years ago committed by Gerrit Code Review
commit b869bf0f38

@ -5794,7 +5794,8 @@ static void manager_dpsendack(struct mansession *s, const struct message *m)
static int manager_show_dialplan_helper(struct mansession *s, const struct message *m,
const char *actionidtext, const char *context,
const char *exten, struct dialplan_counters *dpc,
const struct ast_include *rinclude)
const struct ast_include *rinclude,
int includecount, const char *includes[])
{
struct ast_context *c;
int res = 0, old_total_exten = dpc->total_exten;
@ -5876,7 +5877,24 @@ static int manager_show_dialplan_helper(struct mansession *s, const struct messa
if (exten) {
/* Check all includes for the requested extension */
manager_show_dialplan_helper(s, m, actionidtext, ast_get_include_name(i), exten, dpc, i);
if (includecount >= AST_PBX_MAX_STACK) {
ast_log(LOG_WARNING, "Maximum include depth exceeded!\n");
} else {
int dupe = 0;
int x;
for (x = 0; x < includecount; x++) {
if (!strcasecmp(includes[x], ast_get_include_name(i))) {
dupe++;
break;
}
}
if (!dupe) {
includes[includecount] = ast_get_include_name(i);
manager_show_dialplan_helper(s, m, actionidtext, ast_get_include_name(i), exten, dpc, i, includecount + 1, includes);
} else {
ast_log(LOG_WARNING, "Avoiding circular include of %s within %s\n", ast_get_include_name(i), context);
}
}
} else {
if (!dpc->total_items++)
manager_dpsendack(s, m);
@ -5932,6 +5950,7 @@ static int manager_show_dialplan(struct mansession *s, const struct message *m)
{
const char *exten, *context;
const char *id = astman_get_header(m, "ActionID");
const char *incstack[AST_PBX_MAX_STACK];
char idtext[256];
/* Variables used for different counters */
@ -5947,7 +5966,7 @@ static int manager_show_dialplan(struct mansession *s, const struct message *m)
exten = astman_get_header(m, "Extension");
context = astman_get_header(m, "Context");
manager_show_dialplan_helper(s, m, idtext, context, exten, &counters, NULL);
manager_show_dialplan_helper(s, m, idtext, context, exten, &counters, NULL, 0, incstack);
if (!ast_strlen_zero(context) && !counters.context_existence) {
char errorbuf[BUFSIZ];

Loading…
Cancel
Save