From 69d8d2d8275b0a0827d291335926d02b0596fe83 Mon Sep 17 00:00:00 2001 From: murf Date: Thu, 5 Oct 2006 18:21:39 +0000 Subject: This mod fixes a problem pointed out by dgarstang. Many thanks to Doug\! git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@44488 f38db490-d61c-443f-a65b-d21fe96a405b --- pbx/pbx_ael.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'pbx') diff --git a/pbx/pbx_ael.c b/pbx/pbx_ael.c index dff3023ea..2dc8b37ad 100644 --- a/pbx/pbx_ael.c +++ b/pbx/pbx_ael.c @@ -803,6 +803,24 @@ static void check_expr2_input(pval *expr, char *str) } } +static void check_includes(pval *includes) +{ + struct pval *p4; + for (p4=includes->u1.list; p4; p4=p4->next) { + /* for each context pointed to, find it, then find a context/label that matches the + target here! */ + char *incl_context = p4->u1.str; + /* find a matching context name */ + struct pval *that_other_context = find_context(incl_context); + if (!that_other_context) { + ast_log(LOG_WARNING, "Warning: file %s, line %d-%d: The included context '%s' cannot be found.\n", + includes->filename, includes->startline, includes->endline, incl_context); + warns++; + } + } +} + + static void check_timerange(pval *p) { char times[200]; @@ -1156,7 +1174,10 @@ static void check_goto(pval *item) /* just one item-- the label should be in the current extension */ if (item->u1.list && !item->u1.list->next && !strstr((item->u1.list)->u1.str,"${")) { - struct pval *x = find_label_in_current_extension((char*)((item->u1.list)->u1.str), current_extension? current_extension:current_context); /* if in macro, use current context instead */ + struct pval *z = get_extension_or_contxt(item); + struct pval *x = 0; + if (z) + x = find_label_in_current_extension((char*)((item->u1.list)->u1.str), z); /* if in macro, use current context instead */ /* printf("Called find_label_in_current_extension with arg %s; current_extension is %x: %d\n", (char*)((item->u1.list)->u1.str), current_extension?current_extension:current_context, current_extension?current_extension->type:current_context->type); */ if (!x) { @@ -1175,7 +1196,12 @@ static void check_goto(pval *item) (char*)((item->u1.list)->u1.str), (char *)item->u1.list->next->u1.str); */ if (!strstr((item->u1.list)->u1.str,"${") && !strstr(item->u1.list->next->u1.str,"${") ) /* Don't try to match variables */ { - struct pval *x = find_label_in_current_context((char *)item->u1.list->u1.str, (char *)item->u1.list->next->u1.str, current_context); + struct pval *z = get_contxt(item); + struct pval *x = 0; + + if (z) + x = find_label_in_current_context((char *)item->u1.list->u1.str, (char *)item->u1.list->next->u1.str, z); + if (!x) { ast_log(LOG_ERROR,"Error: file %s, line %d-%d: goto: no label %s|%s exists in the current context, or any of its inclusions!\n", item->filename, item->startline, item->endline, item->u1.list->u1.str, item->u1.list->next->u1.str ); @@ -2354,6 +2380,7 @@ void check_pval_item(pval *item, struct argapp *apps, int in_globals) /* fields: item->u1.list == pval list of PV_WORD elements, one per entry in the list */ check_pval(item->u1.list, apps,in_globals); + check_includes(item); for (lp=item->u1.list; lp; lp=lp->next){ char *incl_context = lp->u1.str; struct pval *that_context = find_context(incl_context); -- cgit v1.2.3