1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-12-23 17:34:00 +03:00

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.
This commit is contained in:
Filipe Brandenburger 2018-05-09 18:10:07 -07:00 committed by Lennart Poettering
parent 3eff246a17
commit 4f29e0db12
2 changed files with 36 additions and 5 deletions

View File

@ -401,6 +401,27 @@ int config_parse(const char *unit,
continuation = mfree(continuation);
}
if (continuation) {
r = parse_line(unit,
filename,
++line,
sections,
lookup,
table,
flags,
&section,
&section_line,
&section_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;
}

View File

@ -277,6 +277,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
@ -293,6 +298,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",
@ -346,27 +356,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;