From adfafd88b2c960e4e27ce1c292234d146d56b4ae Mon Sep 17 00:00:00 2001 From: =?utf8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 14 Aug 2019 17:41:31 +0200 Subject: [PATCH] =?utf8?q?Revert=20"shared/conf-parser,networkd:=20EXTRACT?= =?utf8?q?=5FUNQUOTE|EXTRACT=5FRETAIN=5FESCAPE=20=E2=86=92=20EXTRACT=5FUNQ?= =?utf8?q?UOTE"?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This reverts commit 8a07b4033e5d3c86931b3dd2ddbca41118c05c60. The tests are kept. test-networkd-conf is adjusted to pass. This fixes #13276. I think current rules are extremely confusing, as the case in test-networkd-conf shows. We apply some kinds of unescaping (relating to quoting), but not others (related to escaping of special characters). But fixing this is hard, because people have adjusted quoting to match our rules, and if we make the rules "better", things might break in unexpected places. --- src/basic/extract-word.c | 2 -- src/libsystemd-network/network-internal.c | 2 +- src/network/test-networkd-conf.c | 2 +- src/shared/conf-parser.c | 2 +- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/basic/extract-word.c b/src/basic/extract-word.c index b7ae2ed..34cfb36 100644 --- a/src/basic/extract-word.c +++ b/src/basic/extract-word.c @@ -28,8 +28,6 @@ int extract_first_word(const char **p, char **ret, const char *separators, Extra assert(p); assert(ret); - /* Those two don't make sense together. */ - assert(!FLAGS_SET(flags, EXTRACT_UNQUOTE|EXTRACT_RETAIN_ESCAPE)); /* Bail early if called after last value or with no input */ if (!*p) diff --git a/src/libsystemd-network/network-internal.c b/src/libsystemd-network/network-internal.c index f18ec88..1f2e5c7 100644 --- a/src/libsystemd-network/network-internal.c +++ b/src/libsystemd-network/network-internal.c @@ -254,7 +254,7 @@ int config_parse_match_strv( for (;;) { _cleanup_free_ char *word = NULL, *k = NULL; - r = extract_first_word(&p, &word, NULL, EXTRACT_UNQUOTE); + r = extract_first_word(&p, &word, NULL, EXTRACT_UNQUOTE|EXTRACT_RETAIN_ESCAPE); if (r == 0) return 0; if (r == -ENOMEM) diff --git a/src/network/test-networkd-conf.c b/src/network/test-networkd-conf.c index 6883cbe..2007acb 100644 --- a/src/network/test-networkd-conf.c +++ b/src/network/test-networkd-conf.c @@ -240,7 +240,7 @@ static void test_config_parse_match_strv(void) { "!baz", "KEY=val", "KEY2=val with space", - "KEY3=val with \"quotation\""))); + "KEY3=val with \\quotation\\"))); } int main(int argc, char **argv) { diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c index a495c25..4079208 100644 --- a/src/shared/conf-parser.c +++ b/src/shared/conf-parser.c @@ -760,7 +760,7 @@ int config_parse_strv( for (;;) { char *word = NULL; - r = extract_first_word(&rvalue, &word, NULL, EXTRACT_UNQUOTE); + r = extract_first_word(&rvalue, &word, NULL, EXTRACT_UNQUOTE|EXTRACT_RETAIN_ESCAPE); if (r == 0) break; if (r == -ENOMEM) -- 2.7.4