From 0fdf8b0882bdce409ae3cbaf9517ad3ee06811e3 Mon Sep 17 00:00:00 2001 From: Filipe Brandenburger Date: Wed, 9 May 2018 18:10:07 -0700 Subject: conf-parser: accept trailing backslash at the end of the file (#8941) This makes it behave the same whether there is a blank line or not at the end of the file. This is also consistent with the behavior of the shell on a shell script that ends on a trailing backslash at the last line. Added tests to test_config_parse(), which only pass if the corresponding change to config_parse() is included. --- src/shared/conf-parser.c | 21 +++++++++++++++++++++ src/test/test-conf-parser.c | 20 +++++++++++++++----- 2 files changed, 36 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c index 704c75c3a..73591f70f 100644 --- a/src/shared/conf-parser.c +++ b/src/shared/conf-parser.c @@ -405,6 +405,27 @@ int config_parse(const char *unit, continuation = mfree(continuation); } + if (continuation) { + r = parse_line(unit, + filename, + ++line, + sections, + lookup, + table, + flags, + §ion, + §ion_line, + §ion_ignored, + continuation, + userdata); + if (r < 0) { + if (flags & CONFIG_PARSE_WARN) + log_warning_errno(r, "%s:%u: Failed to parse file: %m", filename, line); + return r; + + } + } + return 0; } diff --git a/src/test/test-conf-parser.c b/src/test/test-conf-parser.c index acd543e51..76419a74b 100644 --- a/src/test/test-conf-parser.c +++ b/src/test/test-conf-parser.c @@ -293,6 +293,11 @@ static const char* const config_file[] = { "2\\\n" "3\n", + "[Section]\n" + "setting1=1\\\n" /* continuation with extra trailing backslash at the end */ + "2\\\n" + "3\\\n", + "[Section]\n" "setting1=1\\\\\\\n" /* continuation with trailing escape symbols */ "\\\\2\n", /* note that C requires one level of escaping, so the @@ -309,6 +314,11 @@ static const char* const config_file[] = { x1000("ABCD") "\\\n" "foobar", + "[Section]\n" + "setting1=" /* a line above LINE_MAX length, with continuation */ + x1000("ABCD") "\\\n" /* and an extra trailing backslash */ + "foobar\\\n", + "[Section]\n" "setting1=" /* a line above the allowed limit: 9 + 1050000 + 1 */ x1000(x1000("x") x10("abcde")) "\n", @@ -362,27 +372,27 @@ static void test_config_parse(unsigned i, const char *s) { assert_se(streq(setting1, "1")); break; - case 4: + case 4 ... 5: assert_se(r == 0); assert_se(streq(setting1, "1 2 3")); break; - case 5: + case 6: assert_se(r == 0); assert_se(streq(setting1, "1\\\\ \\\\2")); break; - case 6: + case 7: assert_se(r == 0); assert_se(streq(setting1, x1000("ABCD"))); break; - case 7: + case 8 ... 9: assert_se(r == 0); assert_se(streq(setting1, x1000("ABCD") " foobar")); break; - case 8 ... 9: + case 10 ... 11: assert_se(r == -ENOBUFS); assert_se(setting1 == NULL); break; -- cgit v1.2.3