[asterisk-commits] murf: branch 1.4 r131242 - /branches/1.4/pbx/pbx_ael.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Jul 16 12:53:44 CDT 2008


Author: murf
Date: Wed Jul 16 12:53:43 2008
New Revision: 131242

URL: http://svn.digium.com/view/asterisk?view=rev&rev=131242
Log:
(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.


Modified:
    branches/1.4/pbx/pbx_ael.c

Modified: branches/1.4/pbx/pbx_ael.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/pbx/pbx_ael.c?view=diff&rev=131242&r1=131241&r2=131242
==============================================================================
--- branches/1.4/pbx/pbx_ael.c (original)
+++ branches/1.4/pbx/pbx_ael.c Wed Jul 16 12:53:43 2008
@@ -1298,8 +1298,9 @@
 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 @@
 				   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 @@
 		/* 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 @@
 		/* 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 @@
 		/* 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 @@
 		/* 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 @@
 			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 @@
 
 				   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 @@
 
 				   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 @@
 				   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 @@
 				   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 @@
 				   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_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);
 	}
 }




More information about the asterisk-commits mailing list