From 0e0149ce91d84f40b98acf4c4bb0da6e29b9c15c Mon Sep 17 00:00:00 2001 From: Martin Kletzander Date: Fri, 27 Nov 2015 14:24:38 +0100 Subject: [PATCH] systemd: Escape only needed characters for machined Machine name escaping follows the same rules as serice name escape, except that '.' and '-' must not be escaped in machine names, due to a bug in systemd-machined. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1282846 Signed-off-by: Martin Kletzander --- src/util/virsystemd.c | 23 ++++++++++++++++------- tests/virsystemdtest.c | 4 ++-- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/util/virsystemd.c b/src/util/virsystemd.c index abd883c738..337d6a208a 100644 --- a/src/util/virsystemd.c +++ b/src/util/virsystemd.c @@ -38,8 +38,17 @@ VIR_LOG_INIT("util.systemd"); +/** + * virSystemdEscapeName: + * + * This function escapes various characters in @name and appends that + * escaped string to @buf, in order to comply with the requirements + * from systemd/machined. Parameter @full_escape decides whether to + * also escape dot as a first character and '-'. + */ static void virSystemdEscapeName(virBufferPtr buf, - const char *name) + const char *name, + bool full_escape) { static const char hextable[16] = "0123456789abcdef"; @@ -57,7 +66,7 @@ static void virSystemdEscapeName(virBufferPtr buf, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \ ":-_.\\" - if (*name == '.') { + if (full_escape && *name == '.') { ESCAPE(*name); name++; } @@ -65,7 +74,7 @@ static void virSystemdEscapeName(virBufferPtr buf, while (*name) { if (*name == '/') virBufferAddChar(buf, '-'); - else if (*name == '-' || + else if ((full_escape && *name == '-') || *name == '\\' || !strchr(VALID_CHARS, *name)) ESCAPE(*name); @@ -85,9 +94,9 @@ char *virSystemdMakeScopeName(const char *name, virBuffer buf = VIR_BUFFER_INITIALIZER; virBufferAddLit(&buf, "machine-"); - virSystemdEscapeName(&buf, drivername); + virSystemdEscapeName(&buf, drivername, true); virBufferAddLit(&buf, "\\x2d"); - virSystemdEscapeName(&buf, name); + virSystemdEscapeName(&buf, name, true); virBufferAddLit(&buf, ".scope"); if (virBufferCheckError(&buf) < 0) @@ -104,7 +113,7 @@ char *virSystemdMakeSliceName(const char *partition) if (*partition == '/') partition++; - virSystemdEscapeName(&buf, partition); + virSystemdEscapeName(&buf, partition, true); virBufferAddLit(&buf, ".slice"); if (virBufferCheckError(&buf) < 0) @@ -130,7 +139,7 @@ char *virSystemdMakeMachineName(const char *name, virBufferAsprintf(&buf, "%s-%s-", username, drivername); } - virSystemdEscapeName(&buf, name); + virSystemdEscapeName(&buf, name, false); machinename = virBufferContentAndReset(&buf); cleanup: diff --git a/tests/virsystemdtest.c b/tests/virsystemdtest.c index 06fec5495b..49d37c2032 100644 --- a/tests/virsystemdtest.c +++ b/tests/virsystemdtest.c @@ -517,9 +517,9 @@ mymain(void) } while (0) TEST_MACHINE("demo", "qemu-demo"); - TEST_MACHINE("demo-name", "qemu-demo\\x2dname"); + TEST_MACHINE("demo-name", "qemu-demo-name"); TEST_MACHINE("demo!name", "qemu-demo\\x21name"); - TEST_MACHINE(".demo", "qemu-\\x2edemo"); + TEST_MACHINE(".demo", "qemu-.demo"); TEST_MACHINE("bull\U0001f4a9", "qemu-bull\\xf0\\x9f\\x92\\xa9"); # define TESTS_PM_SUPPORT_HELPER(name, function) \