diff --git a/man/systemd.syntax.xml b/man/systemd.syntax.xml
index 3c67e92dd5..67cd640eea 100644
--- a/man/systemd.syntax.xml
+++ b/man/systemd.syntax.xml
@@ -73,7 +73,8 @@
backslash is replaced by a space character. This may be used to wrap long lines. The limit on
line length is very large (currently 1 MB), but it is recommended to avoid such long lines and
use multiple directives, variable substitution, or other mechanism as appropriate for the given
- file type.
+ file type. When a comment line or lines follow a line ending with a backslash, the comment block
+ is ignored, so the continued line is concatenated with whatever follows the comment block.
[Section A]
KeyOne=value 1
@@ -85,6 +86,12 @@ KeyTwo=value 2
Setting="something" "some thing" "…"
KeyTwo=value 2 \
value 2 continued
+
+[Section C]
+KeyThree=value 2\
+# this line is ignored
+; this line is ignored too
+ value 2 continued
Boolean arguments used in configuration files can be written in
diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c
index b9c5b412f2..493ece9d09 100644
--- a/src/shared/conf-parser.c
+++ b/src/shared/conf-parser.c
@@ -174,7 +174,7 @@ static int parse_line(
if (!*l)
return 0;
- if (strchr(COMMENTS "\n", *l))
+ if (*l == '\n')
return 0;
include = first_word(l, ".include");
@@ -327,6 +327,9 @@ int config_parse(const char *unit,
return r;
}
+ if (strchr(COMMENTS, *buf))
+ continue;
+
l = buf;
if (!(flags & CONFIG_PARSE_REFUSE_BOM)) {
char *q;
diff --git a/src/test/test-conf-parser.c b/src/test/test-conf-parser.c
index 91f1d9a386..368e02cb33 100644
--- a/src/test/test-conf-parser.c
+++ b/src/test/test-conf-parser.c
@@ -274,6 +274,18 @@ static const char* const config_file[] = {
"2\\\n"
"3\n",
+ "[Section]\n"
+ "#hogehoge\\\n" /* continuation is ignored in comment */
+ "setting1=1\\\n" /* normal continuation */
+ "2\\\n"
+ "3\n",
+
+ "[Section]\n"
+ "setting1=1\\\n" /* normal continuation */
+ "#hogehoge\\\n" /* commented out line in continuation is ignored */
+ "2\\\n"
+ "3\n",
+
"[Section]\n"
"setting1=1\\\n" /* continuation with extra trailing backslash at the end */
"2\\\n"
@@ -350,27 +362,27 @@ static void test_config_parse(unsigned i, const char *s) {
assert_se(streq(setting1, "1"));
break;
- case 4 ... 5:
+ case 4 ... 7:
assert_se(r == 0);
assert_se(streq(setting1, "1 2 3"));
break;
- case 6:
+ case 8:
assert_se(r == 0);
assert_se(streq(setting1, "1\\\\ \\\\2"));
break;
- case 7:
+ case 9:
assert_se(r == 0);
assert_se(streq(setting1, x1000("ABCD")));
break;
- case 8 ... 9:
+ case 10 ... 11:
assert_se(r == 0);
assert_se(streq(setting1, x1000("ABCD") " foobar"));
break;
- case 10 ... 11:
+ case 12 ... 13:
assert_se(r == -ENOBUFS);
assert_se(setting1 == NULL);
break;