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);