settings: Properly match } and # in include statements
authorTobias Brunner <tobias@strongswan.org>
Thu, 15 May 2014 09:55:23 +0000 (11:55 +0200)
committerTobias Brunner <tobias@strongswan.org>
Thu, 15 May 2014 10:03:07 +0000 (12:03 +0200)
Found due to %option nodefault.  A match for } was actually missing
and # was not properly matched if it was part of an include statement
on the last line of a file that did not end with a newline.

src/libstrongswan/settings/settings_lexer.l

index d9af153..c6546f4 100644 (file)
@@ -82,12 +82,22 @@ static void include_files(parser_helper_t *ctx);
 <inc>{
        /* we allow all characters except #, } and spaces, they can be escaped */
        <<EOF>>                         |
-       \n|#.*\n                        |
-       [\t ]                           {
-               if (*yytext && yytext[strlen(yytext) - 1] == '\n')
-               {       /* put the newline back to fix the line numbers */
-                       unput('\n');
-                       yy_set_bol(0);
+       [#}\n\t ]                       {
+               if (*yytext)
+               {
+                       switch (yytext[0])
+                       {
+                               case '\n':
+                                       /* put the newline back to fix the line numbers */
+                                       unput('\n');
+                                       yy_set_bol(0);
+                                       break;
+                               case '#':
+                               case '}':
+                                       /* these are parsed outside of this start condition */
+                                       unput(yytext[0]);
+                                       break;
+                       }
                }
                include_files(yyextra);
                yy_pop_state(yyscanner);