settings: Add support for multi-line strings
authorTobias Brunner <tobias@strongswan.org>
Mon, 8 Jun 2015 15:47:51 +0000 (17:47 +0200)
committerTobias Brunner <tobias@strongswan.org>
Tue, 28 Jul 2015 11:27:32 +0000 (13:27 +0200)
Unterminated strings are now an error.

src/libstrongswan/settings/settings_lexer.l
src/libstrongswan/settings/settings_parser.y
src/libstrongswan/tests/suites/test_settings.c

index 581f834..3c955aa 100644 (file)
@@ -119,16 +119,11 @@ static void include_files(parser_helper_t *ctx);
 <str>{
        "\""                            |
        <<EOF>>                         |
-       \n                                      |
        \\                                      {
                if (!streq(yytext, "\""))
                {
-                       if (streq(yytext, "\n"))
-                       {       /* put the newline back to fix the line numbers */
-                               unput('\n');
-                               yy_set_bol(0);
-                       }
                        PARSER_DBG1(yyextra, "unterminated string detected");
+                       return STRING_ERROR;
                }
                if (yy_top_state(yyscanner) == inc)
                {       /* string include */
@@ -148,7 +143,7 @@ static void include_files(parser_helper_t *ctx);
        \\t     yyextra->string_add(yyextra, "\t");
        \\\r?\n /* merge lines that end with EOL characters */
        \\.     yyextra->string_add(yyextra, yytext+1);
-       [^\\\n"]+                       {
+       [^\\"]+                 {
                yyextra->string_add(yyextra, yytext);
        }
 }
index d95a24b..ed30d19 100644 (file)
@@ -79,7 +79,7 @@ static int yylex(YYSTYPE *lvalp, parser_helper_t *ctx)
        struct kv_t *kv;
 }
 %token <s> NAME STRING
-%token NEWLINE
+%token NEWLINE STRING_ERROR
 
 /* ...and other symbols */
 %type <s> value valuepart
index 9601a34..a725774 100644 (file)
@@ -58,6 +58,10 @@ START_SETUP(setup_base_config)
                "       }\n"
                "       key2 = with space\n"
                "       key3 = \"string with\\nnewline\"\n"
+               "       key4 = \"multi line\n"
+               "string\"\n"
+               "       key5 = \"escaped \\\n"
+               "newline\"\n"
                "}\n"
                "out = side\n"
                "other {\n"
@@ -88,6 +92,8 @@ START_TEST(test_get_str)
        verify_string("", "main.empty");
        verify_string("with space", "main.key2");
        verify_string("string with\nnewline", "main.key3");
+       verify_string("multi line\nstring", "main.key4");
+       verify_string("escaped newline", "main.key5");
        verify_string("value", "main.sub1.key");
        verify_string("value2", "main.sub1.key2");
        verify_string("bar", "main.sub1.subsub.foo");
@@ -97,7 +103,7 @@ START_TEST(test_get_str)
        verify_string("other val", "other.key1");
 
        verify_null("main.none");
-       verify_null("main.key4");
+       verify_null("main.key6");
        verify_null("other.sub");
 }
 END_TEST
@@ -131,7 +137,7 @@ START_TEST(test_get_str_printf)
         * probably document it at least */
        verify_null("main.%s%u.key%d", "sub", 1, 2);
 
-       verify_null("%s.%s%d", "main", "key", 4);
+       verify_null("%s.%s%d", "main", "key", 6);
 }
 END_TEST
 
@@ -906,9 +912,8 @@ START_SETUP(setup_string_config)
        create_settings(chunk_from_str(
                "string = \"  with    accurate\twhitespace\"\n"
                "special = \"all { special } characters # can be used.\"\n"
-               "unterminated = \"is fine\n"
-               "but = produces a warning\n"
-               "newlines = \"can either be encoded\\nor \\\n"
+               "newlines = \"can be encoded explicitly\\nor implicitly\n"
+               "or \\\n"
                "escaped\"\n"
                "quotes = \"\\\"and\\\" slashes \\\\ can \\\\ be\" # escaped too\n"
                "multiple = \"strings\" are \"combined\"\n"
@@ -920,9 +925,7 @@ START_TEST(test_strings)
 {
        verify_string("  with    accurate\twhitespace", "string");
        verify_string("all { special } characters # can be used.", "special");
-       verify_string("is fine", "unterminated");
-       verify_string("produces a warning", "but");
-       verify_string("can either be encoded\nor escaped", "newlines");
+       verify_string("can be encoded explicitly\nor implicitly\nor escaped", "newlines");
        verify_string("\"and\" slashes \\ can \\ be", "quotes");
        verify_string("strings are combined", "multiple");
 }
@@ -990,6 +993,12 @@ START_TEST(test_invalid)
        ck_assert(!settings->load_files(settings, path, FALSE));
 
        contents = chunk_from_str(
+               "unterminated {\n"
+               "       strings = \"are invalid\n");
+       ck_assert(chunk_write(contents, path, 0022, TRUE));
+       ck_assert(!settings->load_files(settings, path, FALSE));
+
+       contents = chunk_from_str(
                "spaces in name {}");
        ck_assert(chunk_write(contents, path, 0022, TRUE));
        ck_assert(!settings->load_files(settings, path, FALSE));