From 0ef69585d8583cd86e53195313dd08f50a0c6019 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 27 Jun 2019 03:00:22 +0900 Subject: [PATCH 1/2] conf-parser: fix continuation handling Before this commit, empty lines cannot break continuation. The bug was introduced by 9adbfeb38ac101d6f73a033bb120d63513ffb240. Closes #12883. --- src/shared/conf-parser.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c index 2df09edaf5..f45dd798b2 100644 --- a/src/shared/conf-parser.c +++ b/src/shared/conf-parser.c @@ -322,7 +322,8 @@ int config_parse(const char *unit, return r; } - if (strchr(COMMENTS, *skip_leading_chars(buf, WHITESPACE))) + l = skip_leading_chars(buf, WHITESPACE); + if (*l != '\0' && strchr(COMMENTS, *l)) continue; l = buf; From 3d5d346aa5e794f95107a1685702e0cebfeaca2e Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 27 Jun 2019 03:03:45 +0900 Subject: [PATCH 2/2] test: add testcase for issue #12883 --- src/test/test-conf-parser.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/test/test-conf-parser.c b/src/test/test-conf-parser.c index 1738938fce..597265efa6 100644 --- a/src/test/test-conf-parser.c +++ b/src/test/test-conf-parser.c @@ -230,6 +230,13 @@ static const char* const config_file[] = { "setting1=2\n" "setting1=1\n", /* repeated settings */ + "[Section]\n" + "[Section]\n" + "setting1=1\n" + "setting1=2\\\n" + " \n" /* empty line breaks continuation */ + "setting1=1\n", /* repeated settings */ + "[Section]\n" "setting1=1\\\n" /* normal continuation */ "2\\\n" @@ -330,32 +337,32 @@ static void test_config_parse(unsigned i, const char *s) { CONFIG_PARSE_WARN, NULL); switch (i) { - case 0 ... 3: + case 0 ... 4: assert_se(r == 0); assert_se(streq(setting1, "1")); break; - case 4 ... 9: + case 5 ... 10: assert_se(r == 0); assert_se(streq(setting1, "1 2 3")); break; - case 10: + case 11: assert_se(r == 0); assert_se(streq(setting1, "1\\\\ \\\\2")); break; - case 11: + case 12: assert_se(r == 0); assert_se(streq(setting1, x1000("ABCD"))); break; - case 12 ... 13: + case 13 ... 14: assert_se(r == 0); assert_se(streq(setting1, x1000("ABCD") " foobar")); break; - case 14 ... 15: + case 15 ... 16: assert_se(r == -ENOBUFS); assert_se(setting1 == NULL); break;