aboutsummaryrefslogtreecommitdiffstats
path: root/pbx
diff options
context:
space:
mode:
authormurf <murf@f38db490-d61c-443f-a65b-d21fe96a405b>2008-07-16 17:53:43 +0000
committermurf <murf@f38db490-d61c-443f-a65b-d21fe96a405b>2008-07-16 17:53:43 +0000
commit42ddea77f80c5007ca2c8b1d4001100fedc8d05b (patch)
tree978cca8266001336bd890ec702161e559981f07e /pbx
parentdc4071e7f7da819af8dd2a6702a07607c342959a (diff)
(closes issue #13090)
Reported by: murf The problem was that, esoteric as it is, because the hangerupper context immediately preceded the std-priv-extent macro, that the checking code accidentally would fall from traversing hangerupper into the std-priv-exten macro, where it would hit the hangerupper in the 'includes', and proceed into an infinite recursion. A small fix to traverse into the statements of the context instead of the context solves this issue. I also added some commented out printfs for debug, which were pretty handy in the face of a dorky gdb. This was a problem around since the package was first written; but evidently pretty rare in turning up in the field. git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@131242 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'pbx')
-rw-r--r--pbx/pbx_ael.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/pbx/pbx_ael.c b/pbx/pbx_ael.c
index 0e9539966..6a6e05eef 100644
--- a/pbx/pbx_ael.c
+++ b/pbx/pbx_ael.c
@@ -1298,8 +1298,9 @@ static void check_goto(pval *item)
static void find_pval_goto_item(pval *item, int lev)
{
struct pval *p4;
+
if (lev>100) {
- ast_log(LOG_ERROR,"find_pval_goto in infinite loop!\n\n");
+ ast_log(LOG_ERROR,"find_pval_goto in infinite loop! item_type: %d\n\n", item->type);
return;
}
@@ -1313,7 +1314,7 @@ static void find_pval_goto_item(pval *item, int lev)
item->u3.macro_statements == pval list of statements in macro body.
*/
- /* printf("Descending into matching macro %s\n", match_context); */
+ /* printf("Descending into macro %s at line %d\n", item->u1.str, item->startline); */
find_pval_gotos(item->u3.macro_statements,lev+1); /* if we're just searching for a context, don't bother descending into them */
break;
@@ -1329,6 +1330,7 @@ static void find_pval_goto_item(pval *item, int lev)
/* fields: item->u1.str == value of case
item->u2.statements == pval list of statements under the case
*/
+ /* printf("Descending into Case of %s\n", item->u1.str); */
find_pval_gotos(item->u2.statements,lev+1);
break;
@@ -1336,6 +1338,7 @@ static void find_pval_goto_item(pval *item, int lev)
/* fields: item->u1.str == value of case
item->u2.statements == pval list of statements under the case
*/
+ /* printf("Descending into Pattern of %s\n", item->u1.str); */
find_pval_gotos(item->u2.statements,lev+1);
break;
@@ -1343,6 +1346,7 @@ static void find_pval_goto_item(pval *item, int lev)
/* fields:
item->u2.statements == pval list of statements under the case
*/
+ /* printf("Descending into default\n"); */
find_pval_gotos(item->u2.statements,lev+1);
break;
@@ -1350,12 +1354,14 @@ static void find_pval_goto_item(pval *item, int lev)
/* fields: item->u1.str == name of extension to catch
item->u2.statements == pval list of statements in context body
*/
+ /* printf("Descending into catch of %s\n", item->u1.str); */
find_pval_gotos(item->u2.statements,lev+1);
break;
case PV_STATEMENTBLOCK:
/* fields: item->u1.list == pval list of statements in block, one per entry in the list
*/
+ /* printf("Descending into statement block\n"); */
find_pval_gotos(item->u1.list,lev+1);
break;
@@ -1375,8 +1381,9 @@ static void find_pval_goto_item(pval *item, int lev)
char *incl_context = p4->u1.str;
/* find a matching context name */
struct pval *that_context = find_context(incl_context);
- if (that_context) {
- find_pval_gotos(that_context,lev+1); /* keep working up the includes */
+ if (that_context && that_context->u2.statements) {
+ /* printf("Descending into include of '%s' at line %d; that_context=%s, that_context type=%d\n", incl_context, item->startline, that_context->u1.str, that_context->type); */
+ find_pval_gotos(that_context->u2.statements,lev+1); /* keep working up the includes */
}
}
break;
@@ -1388,6 +1395,7 @@ static void find_pval_goto_item(pval *item, int lev)
item->u4.for_statements == a pval list of statements in the for ()
*/
+ /* printf("Descending into for at line %d\n", item->startline); */
find_pval_gotos(item->u4.for_statements,lev+1);
break;
@@ -1396,6 +1404,7 @@ static void find_pval_goto_item(pval *item, int lev)
item->u2.statements == a pval list of statements in the while ()
*/
+ /* printf("Descending into while at line %d\n", item->startline); */
find_pval_gotos(item->u2.statements,lev+1);
break;
@@ -1421,9 +1430,11 @@ static void find_pval_goto_item(pval *item, int lev)
item->u3.else_statements == a pval list of statements in the else
(could be zero)
*/
+ /* printf("Descending into random/iftime/if at line %d\n", item->startline); */
find_pval_gotos(item->u2.statements,lev+1);
if (item->u3.else_statements) {
+ /* printf("Descending into random/iftime/if's ELSE at line %d\n", item->startline); */
find_pval_gotos(item->u3.else_statements,lev+1);
}
break;
@@ -1434,6 +1445,7 @@ static void find_pval_goto_item(pval *item, int lev)
item->u2.statements == a pval list of statements in the switch,
(will be case statements, most likely!)
*/
+ /* printf("Descending into switch at line %d\n", item->startline); */
find_pval_gotos(item->u3.else_statements,lev+1);
break;
@@ -1445,6 +1457,7 @@ static void find_pval_goto_item(pval *item, int lev)
item->u4.regexten == an int boolean. non-zero says that regexten was specified
*/
+ /* printf("Descending into extension %s at line %d\n", item->u1.str, item->startline); */
find_pval_gotos(item->u2.statements,lev+1);
break;
@@ -1456,9 +1469,9 @@ static void find_pval_goto_item(pval *item, int lev)
static void find_pval_gotos(pval *item,int lev)
{
pval *i;
-
+
for (i=item; i; i=i->next) {
-
+ /* printf("About to call pval_goto_item, itemcount=%d, itemtype=%d\n", item_count, i->type); */
find_pval_goto_item(i, lev);
}
}