diff --git a/apps/app_page.c b/apps/app_page.c index 1884f4347f94ef80e86c6e937c770d2d42ae4fd1..0681e72cb8bd66ce8edd19235c66e5a5feacf76d 100644 --- a/apps/app_page.c +++ b/apps/app_page.c @@ -117,7 +117,6 @@ AST_APP_OPTIONS(page_opts, { AST_APP_OPTION('i', PAGE_IGNORE_FORWARDS), }); -#define MAX_DIALS 128 static int page_exec(struct ast_channel *chan, void *data) { @@ -127,7 +126,8 @@ static int page_exec(struct ast_channel *chan, void *data) unsigned int confid = ast_random(); struct ast_app *app; int res = 0, pos = 0, i = 0; - struct ast_dial *dials[MAX_DIALS]; + struct ast_dial **dial_list; + unsigned int num_dials; int timeout = 0; char *parse; @@ -167,6 +167,18 @@ static int page_exec(struct ast_channel *chan, void *data) snprintf(meetmeopts, sizeof(meetmeopts), "MeetMe,%ud,%s%sqxdw(5)", confid, (ast_test_flag(&flags, PAGE_DUPLEX) ? "" : "m"), (ast_test_flag(&flags, PAGE_RECORD) ? "r" : "") ); + /* Count number of extensions in list by number of ampersands + 1 */ + num_dials = 1; + tmp = args.devices; + while (*tmp && *tmp++ == '&') { + num_dials++; + } + + if (!(dial_list = ast_calloc(num_dials, sizeof(void *)))) { + ast_log(LOG_ERROR, "Can't allocate %ld bytes for dial list\n", (sizeof(void *) * num_dials)); + return -1; + } + /* Go through parsing/calling each device */ while ((tech = strsep(&args.devices, "&"))) { int state = 0; @@ -222,7 +234,7 @@ static int page_exec(struct ast_channel *chan, void *data) ast_dial_run(dial, chan, 1); /* Put in our dialing array */ - dials[pos++] = dial; + dial_list[pos++] = dial; } if (!ast_test_flag(&flags, PAGE_QUIET)) { @@ -239,7 +251,7 @@ static int page_exec(struct ast_channel *chan, void *data) /* Go through each dial attempt cancelling, joining, and destroying */ for (i = 0; i < pos; i++) { - struct ast_dial *dial = dials[i]; + struct ast_dial *dial = dial_list[i]; /* We have to wait for the async thread to exit as it's possible Meetme won't throw them out immediately */ ast_dial_join(dial);