dect
/
asterisk
Archived
13
0
Fork 0

Merged revisions 109309 via svnmerge from

https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r109309 | murf | 2008-03-18 00:37:15 -0600 (Tue, 18 Mar 2008) | 17 lines

(closes issue #11903)
Reported by: atis

Many thanks to atis for spotting this problem and reporting it.
The fix was to straighten out how items are placed on and removed
from the file stack. Regressions as well as the provided test case
helped to straighten out all code paths. valgrind was used to make
sure all memory allocated was freed.

Sorry for not solving this earlier. I got distracted.

Added the ntest23 regression test, which is mainly a copy of ntest22, 
but with a few juicy errors thrown in, to replicate the kind of 
error that atis spotted.



........


git-svn-id: http://svn.digium.com/svn/asterisk/trunk@109357 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
murf 2008-03-18 14:09:50 +00:00
parent ee49273d4d
commit 64b640a6f7
19 changed files with 136 additions and 34 deletions

View File

@ -174,7 +174,7 @@ struct ast_sw *localized_walk_context_switches(struct ast_context *con,
void localized_context_destroy(struct ast_context *con, const char *registrar);
int localized_pbx_load_module(void);
struct ast_context *localized_context_create(struct ast_context **extcontexts, const char *name, const char *registrar);
struct ast_context *localized_context_find_or_create(struct ast_context **extcontexts, void *tab, const char *name, const char *registrar);
int localized_pbx_builtin_setvar(struct ast_channel *chan, void *data);
int localized_context_add_ignorepat2(struct ast_context *con, const char *value, const char *registrar);
int localized_context_add_switch2(struct ast_context *con, const char *value,
@ -185,7 +185,7 @@ int localized_add_extension2(struct ast_context *con,
int replace, const char *extension, int priority, const char *label, const char *callerid,
const char *application, void *data, void (*datad)(void *),
const char *registrar);
void localized_merge_contexts_and_delete(struct ast_context **extcontexts, const char *registrar);
void localized_merge_contexts_and_delete(struct ast_context **extcontexts, void *tab, const char *registrar);
int localized_context_verify_includes(struct ast_context *con);
void localized_use_conf_dir(void);
void localized_use_local_dir(void);

View File

@ -0,0 +1,7 @@
#include "t1/*.ael"
context z ()
{
123 => NoOp(hi there, z);
124 => NoOp(hi there, z);
}

View File

@ -0,0 +1,6 @@
context qq
{
567 => NoOp(hi there, qq);
}

View File

@ -0,0 +1,4 @@
context a
{
134 => NoOp(hi there, a);
}

View File

@ -0,0 +1,6 @@
context b
{
456 => NoOp(hithere, b);
}

View File

@ -0,0 +1,13 @@
context c()
{
567 => NoOp(hi there, c);
}
#include "t2/*.ael"
context w()
{
890 => NoOp(hi there, w);
}

View File

@ -0,0 +1,4 @@
context d
{
134 => NoOp(hi there, d);
}

View File

@ -0,0 +1,6 @@
context e
{
456 => NoOp(hithere, e);
}

View File

@ -0,0 +1,9 @@
#include "qq.ael"
context f
{
567 => NoOp(hi there, f);
}
#include "t3/*.ael"

View File

@ -0,0 +1,4 @@
context g
{
134 => NoOp(hi there, g);
}

View File

@ -0,0 +1,6 @@
context h
{
456 => NoOp(hithere, h);
}

View File

@ -0,0 +1,4 @@
context i
{
134 => NoOp(hi there, i);
}

View File

@ -0,0 +1,6 @@
context j
{
567 => NoOp(hi there, j);
}

View File

@ -0,0 +1,24 @@
(If you find progress and other non-error messages irritating, you can use -q to suppress them)
(You can use the -n option if you aren't interested in seeing all the instructions generated by the compiler)
(You can use the -w option to dump extensions.conf format to extensions.conf.aeldump)
LOG: lev:2 file:pbx_ael.c line:116 func: pbx_load_module Starting AEL load process.
LOG: lev:2 file:ael.flex line:672 func: setup_filestack --Read in included file ././t1/a.ael, 41 chars
LOG: lev:2 file:ael.flex line:672 func: setup_filestack --Read in included file ././t1/b.ael, 42 chars
LOG: lev:2 file:ael.flex line:672 func: setup_filestack --Read in included file ././t1/c.ael, 110 chars
LOG: lev:4 file:ael.y line:774 func: ael_yyerror ==== File: ././t1/c.ael, Line 3, Cols: 10-10: Error: syntax error, unexpected '(', expecting '{'
LOG: lev:2 file:ael.flex line:672 func: setup_filestack --Read in included file ././t2/d.ael, 41 chars
LOG: lev:2 file:ael.flex line:672 func: setup_filestack --Read in included file ././t2/e.ael, 42 chars
LOG: lev:2 file:ael.flex line:672 func: setup_filestack --Read in included file ././t2/f.ael, 82 chars
LOG: lev:2 file:ael.flex line:672 func: setup_filestack --Read in included file ././qq.ael, 45 chars
LOG: lev:2 file:ael.flex line:672 func: setup_filestack --Read in included file ././t3/g.ael, 41 chars
LOG: lev:2 file:ael.flex line:672 func: setup_filestack --Read in included file ././t3/h.ael, 42 chars
LOG: lev:2 file:ael.flex line:672 func: setup_filestack --Read in included file ././t3/i.ael, 41 chars
LOG: lev:2 file:ael.flex line:672 func: setup_filestack --Read in included file ././t3/j.ael, 43 chars
LOG: lev:4 file:ael.y line:774 func: ael_yyerror ==== File: ././t1/c.ael, Line 10, Cols: 10-10: Error: syntax error, unexpected '(', expecting '{'
LOG: lev:2 file:pbx_ael.c line:129 func: pbx_load_module AEL load process: parsed config file name './extensions.ael'.
LOG: lev:4 file:pbx_ael.c line:145 func: pbx_load_module Sorry, but 2 syntax errors and 0 semantic errors were detected. It doesn't make sense to compile.
LOG: lev:4 file:ael2_parse line:544 func: main 0 contexts, 0 extensions, 0 priorities

View File

@ -447,8 +447,6 @@ includes { STORE_POS; return KW_INCLUDES;}
<<EOF>> {
char fnamebuf[2048];
if (include_stack_index > 0 && include_stack[include_stack_index-1].globbuf_pos < include_stack[include_stack_index-1].globbuf.gl_pathc-1) {
free(my_file);
my_file = 0;
yy_delete_buffer( YY_CURRENT_BUFFER, yyscanner );
include_stack[include_stack_index-1].globbuf_pos++;
setup_filestack(fnamebuf, sizeof(fnamebuf), &include_stack[include_stack_index-1].globbuf, include_stack[include_stack_index-1].globbuf_pos, yyscanner, 0);
@ -459,13 +457,13 @@ includes { STORE_POS; return KW_INCLUDES;}
free(include_stack[include_stack_index].fname);
include_stack[include_stack_index].fname = 0;
}
if (my_file) {
free(my_file);
my_file = 0;
}
if ( --include_stack_index < 0 ) {
yyterminate();
} else {
if (my_file) {
free(my_file);
my_file = 0;
}
globfree(&include_stack[include_stack_index].globbuf);
include_stack[include_stack_index].globbuf_pos = -1;
@ -672,12 +670,16 @@ static void setup_filestack(char *fnamebuf2, int fnamebuf_siz, glob_t *globbuf,
buffer[stats.st_size] = 0;
ast_log(LOG_NOTICE," --Read in included file %s, %d chars\n",fnamebuf2, (int)stats.st_size);
fclose(in1);
if (my_file)
free(my_file);
my_file = strdup(fnamebuf2);
if (include_stack[include_stack_index].fname) {
free(include_stack[include_stack_index].fname);
include_stack[include_stack_index].fname = 0;
}
include_stack[include_stack_index].fname = strdup(my_file);
include_stack[include_stack_index].lineno = my_lineno;
include_stack[include_stack_index].colno = my_col+yyleng;
if (my_file)
free(my_file);
my_file = strdup(fnamebuf2);
if (create)
include_stack[include_stack_index].globbuf = *globbuf;

View File

@ -793,6 +793,7 @@ static yyconst flex_int16_t yy_chk[1035] =
* bison-locations is probably not needed.
*/
#line 63 "ael.flex"
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include <sys/types.h>
@ -1746,8 +1747,6 @@ case YY_STATE_EOF(comment):
{
char fnamebuf[2048];
if (include_stack_index > 0 && include_stack[include_stack_index-1].globbuf_pos < include_stack[include_stack_index-1].globbuf.gl_pathc-1) {
free(my_file);
my_file = 0;
ael_yy_delete_buffer(YY_CURRENT_BUFFER,yyscanner );
include_stack[include_stack_index-1].globbuf_pos++;
setup_filestack(fnamebuf, sizeof(fnamebuf), &include_stack[include_stack_index-1].globbuf, include_stack[include_stack_index-1].globbuf_pos, yyscanner, 0);
@ -1758,13 +1757,13 @@ case YY_STATE_EOF(comment):
free(include_stack[include_stack_index].fname);
include_stack[include_stack_index].fname = 0;
}
if (my_file) {
free(my_file);
my_file = 0;
}
if ( --include_stack_index < 0 ) {
yyterminate();
} else {
if (my_file) {
free(my_file);
my_file = 0;
}
globfree(&include_stack[include_stack_index].globbuf);
include_stack[include_stack_index].globbuf_pos = -1;
@ -1779,10 +1778,10 @@ case YY_STATE_EOF(comment):
YY_BREAK
case 63:
YY_RULE_SETUP
#line 481 "ael.flex"
#line 479 "ael.flex"
ECHO;
YY_BREAK
#line 1786 "ael_lex.c"
#line 1784 "ael_lex.c"
case YY_END_OF_BUFFER:
{
@ -2907,7 +2906,7 @@ void *ael_yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner)
#define YYTABLES_NAME "yytables"
#line 481 "ael.flex"
#line 479 "ael.flex"
@ -3103,12 +3102,16 @@ static void setup_filestack(char *fnamebuf2, int fnamebuf_siz, glob_t *globbuf,
buffer[stats.st_size] = 0;
ast_log(LOG_NOTICE," --Read in included file %s, %d chars\n",fnamebuf2, (int)stats.st_size);
fclose(in1);
if (my_file)
free(my_file);
my_file = strdup(fnamebuf2);
if (include_stack[include_stack_index].fname) {
free(include_stack[include_stack_index].fname);
include_stack[include_stack_index].fname = 0;
}
include_stack[include_stack_index].fname = strdup(my_file);
include_stack[include_stack_index].lineno = my_lineno;
include_stack[include_stack_index].colno = my_col+yyleng;
if (my_file)
free(my_file);
my_file = strdup(fnamebuf2);
if (create)
include_stack[include_stack_index].globbuf = *globbuf;

View File

@ -97,7 +97,7 @@ int ast_add_extension2(struct ast_context *con,
const char *registrar);
void pbx_builtin_setvar(void *chan, void *data);
struct ast_context * ast_context_create(void **extcontexts, const char *name, const char *registrar);
struct ast_context * ast_context_find_or_create(void **extcontexts, const char *name, const char *registrar);
struct ast_context * ast_context_find_or_create(void **extcontexts, void *tab, const char *name, const char *registrar);
void ast_context_add_ignorepat2(struct ast_context *con, const char *value, const char *registrar);
void ast_context_add_include2(struct ast_context *con, const char *value, const char *registrar);
void ast_context_add_switch2(struct ast_context *con, const char *value, const char *data, int eval, const char *registrar);
@ -361,7 +361,7 @@ struct ast_context * ast_context_create(void **extcontexts, const char *name, co
return x;
}
struct ast_context * ast_context_find_or_create(void **extcontexts, const char *name, const char *registrar)
struct ast_context * ast_context_find_or_create(void **extcontexts, void *tab, const char *name, const char *registrar)
{
struct ast_context *x = calloc(1, sizeof(*x));
if (!x)

View File

@ -610,7 +610,7 @@ struct ast_context *ast_context_find_or_create(struct ast_context **extcontexts,
{
printf("find/Creating context %s, registrar=%s\n", name, registrar);
return localized_context_create(extcontexts, name, registrar);
return localized_context_find_or_create(extcontexts, exttable, name, registrar);
}
void ast_cli_register_multiple(void);
@ -657,7 +657,7 @@ void ast_merge_contexts_and_delete(struct ast_context **extcontexts, struct ast_
void ast_merge_contexts_and_delete(struct ast_context **extcontexts, struct ast_hashtab *exttable, const char *registrar)
{
localized_merge_contexts_and_delete(extcontexts, registrar);
localized_merge_contexts_and_delete(extcontexts, exttable, registrar);
}
struct ast_exten *pbx_find_extension(struct ast_channel *chan,

View File

@ -5520,20 +5520,18 @@ static int ast_findlabel_extension2(struct ast_channel *c, struct ast_context *c
return pbx_extension_helper(c, con, NULL, exten, 0, label, callerid, E_FINDLABEL);
}
static struct ast_context *ast_context_find_or_create(struct ast_context **extcontexts, const char *name, const char *registrar)
static struct ast_context *ast_context_find_or_create(struct ast_context **extcontexts, void *tab, const char *name, const char *registrar)
{
return __ast_context_create(extcontexts, name, registrar, 1);
}
struct ast_context *localized_context_create(struct ast_context **extcontexts, const char *name, const char *registrar);
struct ast_context *localized_context_create(struct ast_context **extcontexts, const char *name, const char *registrar)
struct ast_context *localized_context_find_or_create(struct ast_context **extcontexts, void *tab, const char *name, const char *registrar);
struct ast_context *localized_context_find_or_create(struct ast_context **extcontexts, void *tab, const char *name, const char *registrar)
{
return __ast_context_create(extcontexts, name, registrar, 0);
return __ast_context_create(extcontexts, name, registrar, 1);
}
/* chopped this one off at the knees */
static int ast_func_read(struct ast_channel *chan, const char *function, char *workspace, size_t len)
{
@ -5916,7 +5914,7 @@ static int pbx_load_config(const char *config_file)
/* All categories but "general" or "globals" are considered contexts */
if (!strcasecmp(cxt, "general") || !strcasecmp(cxt, "globals"))
continue;
con=ast_context_find_or_create(&local_contexts,cxt, registrar);
con=ast_context_find_or_create(&local_contexts,NULL,cxt, registrar);
if (con == NULL)
continue;