From 6c23fca72a36b83113f43a470f244cceb939e695 Mon Sep 17 00:00:00 2001 From: Steve Murphy Date: Tue, 18 Mar 2008 15:14:22 +0000 Subject: [PATCH] Merged revisions 109357 via svnmerge from https://origsvn.digium.com/svn/asterisk/trunk ................ r109357 | murf | 2008-03-18 08:09:50 -0600 (Tue, 18 Mar 2008) | 25 lines 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: https://origsvn.digium.com/svn/asterisk/branches/1.6.0@109397 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- pbx/ael/ael-test/ael-ntest23/extensions.ael | 7 ++++++ pbx/ael/ael-test/ael-ntest23/qq.ael | 6 ++++++ pbx/ael/ael-test/ael-ntest23/t1/a.ael | 4 ++++ pbx/ael/ael-test/ael-ntest23/t1/b.ael | 6 ++++++ pbx/ael/ael-test/ael-ntest23/t1/c.ael | 13 +++++++++++ pbx/ael/ael-test/ael-ntest23/t2/d.ael | 4 ++++ pbx/ael/ael-test/ael-ntest23/t2/e.ael | 6 ++++++ pbx/ael/ael-test/ael-ntest23/t2/f.ael | 9 ++++++++ pbx/ael/ael-test/ael-ntest23/t3/g.ael | 4 ++++ pbx/ael/ael-test/ael-ntest23/t3/h.ael | 6 ++++++ pbx/ael/ael-test/ael-ntest23/t3/i.ael | 4 ++++ pbx/ael/ael-test/ael-ntest23/t3/j.ael | 6 ++++++ pbx/ael/ael-test/ref.ael-ntest23 | 24 +++++++++++++++++++++ res/ael/ael.flex | 20 +++++++++-------- res/ael/ael_lex.c | 21 ++++++++++-------- 15 files changed, 122 insertions(+), 18 deletions(-) create mode 100644 pbx/ael/ael-test/ael-ntest23/extensions.ael create mode 100644 pbx/ael/ael-test/ael-ntest23/qq.ael create mode 100644 pbx/ael/ael-test/ael-ntest23/t1/a.ael create mode 100644 pbx/ael/ael-test/ael-ntest23/t1/b.ael create mode 100644 pbx/ael/ael-test/ael-ntest23/t1/c.ael create mode 100644 pbx/ael/ael-test/ael-ntest23/t2/d.ael create mode 100644 pbx/ael/ael-test/ael-ntest23/t2/e.ael create mode 100644 pbx/ael/ael-test/ael-ntest23/t2/f.ael create mode 100644 pbx/ael/ael-test/ael-ntest23/t3/g.ael create mode 100644 pbx/ael/ael-test/ael-ntest23/t3/h.ael create mode 100644 pbx/ael/ael-test/ael-ntest23/t3/i.ael create mode 100644 pbx/ael/ael-test/ael-ntest23/t3/j.ael create mode 100644 pbx/ael/ael-test/ref.ael-ntest23 diff --git a/pbx/ael/ael-test/ael-ntest23/extensions.ael b/pbx/ael/ael-test/ael-ntest23/extensions.ael new file mode 100644 index 0000000000..7128258ed7 --- /dev/null +++ b/pbx/ael/ael-test/ael-ntest23/extensions.ael @@ -0,0 +1,7 @@ +#include "t1/*.ael" + +context z () +{ + 123 => NoOp(hi there, z); + 124 => NoOp(hi there, z); +} diff --git a/pbx/ael/ael-test/ael-ntest23/qq.ael b/pbx/ael/ael-test/ael-ntest23/qq.ael new file mode 100644 index 0000000000..c446f53fc8 --- /dev/null +++ b/pbx/ael/ael-test/ael-ntest23/qq.ael @@ -0,0 +1,6 @@ + + +context qq +{ + 567 => NoOp(hi there, qq); +} diff --git a/pbx/ael/ael-test/ael-ntest23/t1/a.ael b/pbx/ael/ael-test/ael-ntest23/t1/a.ael new file mode 100644 index 0000000000..62e3fc5888 --- /dev/null +++ b/pbx/ael/ael-test/ael-ntest23/t1/a.ael @@ -0,0 +1,4 @@ +context a +{ + 134 => NoOp(hi there, a); +} diff --git a/pbx/ael/ael-test/ael-ntest23/t1/b.ael b/pbx/ael/ael-test/ael-ntest23/t1/b.ael new file mode 100644 index 0000000000..29d8d1ff43 --- /dev/null +++ b/pbx/ael/ael-test/ael-ntest23/t1/b.ael @@ -0,0 +1,6 @@ + + +context b +{ + 456 => NoOp(hithere, b); +} diff --git a/pbx/ael/ael-test/ael-ntest23/t1/c.ael b/pbx/ael/ael-test/ael-ntest23/t1/c.ael new file mode 100644 index 0000000000..d18eb7677b --- /dev/null +++ b/pbx/ael/ael-test/ael-ntest23/t1/c.ael @@ -0,0 +1,13 @@ + + +context c() +{ + 567 => NoOp(hi there, c); +} + +#include "t2/*.ael" + +context w() +{ + 890 => NoOp(hi there, w); +} diff --git a/pbx/ael/ael-test/ael-ntest23/t2/d.ael b/pbx/ael/ael-test/ael-ntest23/t2/d.ael new file mode 100644 index 0000000000..6362278f7a --- /dev/null +++ b/pbx/ael/ael-test/ael-ntest23/t2/d.ael @@ -0,0 +1,4 @@ +context d +{ + 134 => NoOp(hi there, d); +} diff --git a/pbx/ael/ael-test/ael-ntest23/t2/e.ael b/pbx/ael/ael-test/ael-ntest23/t2/e.ael new file mode 100644 index 0000000000..9465c8b4ee --- /dev/null +++ b/pbx/ael/ael-test/ael-ntest23/t2/e.ael @@ -0,0 +1,6 @@ + + +context e +{ + 456 => NoOp(hithere, e); +} diff --git a/pbx/ael/ael-test/ael-ntest23/t2/f.ael b/pbx/ael/ael-test/ael-ntest23/t2/f.ael new file mode 100644 index 0000000000..ba15a63894 --- /dev/null +++ b/pbx/ael/ael-test/ael-ntest23/t2/f.ael @@ -0,0 +1,9 @@ +#include "qq.ael" + +context f +{ + 567 => NoOp(hi there, f); +} + +#include "t3/*.ael" + diff --git a/pbx/ael/ael-test/ael-ntest23/t3/g.ael b/pbx/ael/ael-test/ael-ntest23/t3/g.ael new file mode 100644 index 0000000000..0f1ecc8052 --- /dev/null +++ b/pbx/ael/ael-test/ael-ntest23/t3/g.ael @@ -0,0 +1,4 @@ +context g +{ + 134 => NoOp(hi there, g); +} diff --git a/pbx/ael/ael-test/ael-ntest23/t3/h.ael b/pbx/ael/ael-test/ael-ntest23/t3/h.ael new file mode 100644 index 0000000000..f9e3ca89f0 --- /dev/null +++ b/pbx/ael/ael-test/ael-ntest23/t3/h.ael @@ -0,0 +1,6 @@ + + +context h +{ + 456 => NoOp(hithere, h); +} diff --git a/pbx/ael/ael-test/ael-ntest23/t3/i.ael b/pbx/ael/ael-test/ael-ntest23/t3/i.ael new file mode 100644 index 0000000000..5639a1e98c --- /dev/null +++ b/pbx/ael/ael-test/ael-ntest23/t3/i.ael @@ -0,0 +1,4 @@ +context i +{ + 134 => NoOp(hi there, i); +} diff --git a/pbx/ael/ael-test/ael-ntest23/t3/j.ael b/pbx/ael/ael-test/ael-ntest23/t3/j.ael new file mode 100644 index 0000000000..8dfc6c05f5 --- /dev/null +++ b/pbx/ael/ael-test/ael-ntest23/t3/j.ael @@ -0,0 +1,6 @@ + + +context j +{ + 567 => NoOp(hi there, j); +} diff --git a/pbx/ael/ael-test/ref.ael-ntest23 b/pbx/ael/ael-test/ref.ael-ntest23 new file mode 100644 index 0000000000..b7b4852eca --- /dev/null +++ b/pbx/ael/ael-test/ref.ael-ntest23 @@ -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 diff --git a/res/ael/ael.flex b/res/ael/ael.flex index cf2d36a2c7..35ca126aae 100644 --- a/res/ael/ael.flex +++ b/res/ael/ael.flex @@ -445,8 +445,6 @@ includes { STORE_POS; return KW_INCLUDES;} <> { 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); @@ -457,13 +455,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; @@ -670,12 +668,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; diff --git a/res/ael/ael_lex.c b/res/ael/ael_lex.c index 26206af5d6..1f96e33778 100644 --- a/res/ael/ael_lex.c +++ b/res/ael/ael_lex.c @@ -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 @@ -1745,8 +1746,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); @@ -1757,13 +1756,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; @@ -3102,12 +3101,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;