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 <mkletzan@redhat.com>
This commit is contained in:
Martin Kletzander 2015-11-27 14:24:38 +01:00
parent baa3b463b3
commit 0e0149ce91
2 changed files with 18 additions and 9 deletions

View File

@ -38,8 +38,17 @@
VIR_LOG_INIT("util.systemd"); 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, static void virSystemdEscapeName(virBufferPtr buf,
const char *name) const char *name,
bool full_escape)
{ {
static const char hextable[16] = "0123456789abcdef"; static const char hextable[16] = "0123456789abcdef";
@ -57,7 +66,7 @@ static void virSystemdEscapeName(virBufferPtr buf,
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" \ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
":-_.\\" ":-_.\\"
if (*name == '.') { if (full_escape && *name == '.') {
ESCAPE(*name); ESCAPE(*name);
name++; name++;
} }
@ -65,7 +74,7 @@ static void virSystemdEscapeName(virBufferPtr buf,
while (*name) { while (*name) {
if (*name == '/') if (*name == '/')
virBufferAddChar(buf, '-'); virBufferAddChar(buf, '-');
else if (*name == '-' || else if ((full_escape && *name == '-') ||
*name == '\\' || *name == '\\' ||
!strchr(VALID_CHARS, *name)) !strchr(VALID_CHARS, *name))
ESCAPE(*name); ESCAPE(*name);
@ -85,9 +94,9 @@ char *virSystemdMakeScopeName(const char *name,
virBuffer buf = VIR_BUFFER_INITIALIZER; virBuffer buf = VIR_BUFFER_INITIALIZER;
virBufferAddLit(&buf, "machine-"); virBufferAddLit(&buf, "machine-");
virSystemdEscapeName(&buf, drivername); virSystemdEscapeName(&buf, drivername, true);
virBufferAddLit(&buf, "\\x2d"); virBufferAddLit(&buf, "\\x2d");
virSystemdEscapeName(&buf, name); virSystemdEscapeName(&buf, name, true);
virBufferAddLit(&buf, ".scope"); virBufferAddLit(&buf, ".scope");
if (virBufferCheckError(&buf) < 0) if (virBufferCheckError(&buf) < 0)
@ -104,7 +113,7 @@ char *virSystemdMakeSliceName(const char *partition)
if (*partition == '/') if (*partition == '/')
partition++; partition++;
virSystemdEscapeName(&buf, partition); virSystemdEscapeName(&buf, partition, true);
virBufferAddLit(&buf, ".slice"); virBufferAddLit(&buf, ".slice");
if (virBufferCheckError(&buf) < 0) if (virBufferCheckError(&buf) < 0)
@ -130,7 +139,7 @@ char *virSystemdMakeMachineName(const char *name,
virBufferAsprintf(&buf, "%s-%s-", username, drivername); virBufferAsprintf(&buf, "%s-%s-", username, drivername);
} }
virSystemdEscapeName(&buf, name); virSystemdEscapeName(&buf, name, false);
machinename = virBufferContentAndReset(&buf); machinename = virBufferContentAndReset(&buf);
cleanup: cleanup:

View File

@ -517,9 +517,9 @@ mymain(void)
} while (0) } while (0)
TEST_MACHINE("demo", "qemu-demo"); 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!name", "qemu-demo\\x21name");
TEST_MACHINE(".demo", "qemu-\\x2edemo"); TEST_MACHINE(".demo", "qemu-.demo");
TEST_MACHINE("bull\U0001f4a9", "qemu-bull\\xf0\\x9f\\x92\\xa9"); TEST_MACHINE("bull\U0001f4a9", "qemu-bull\\xf0\\x9f\\x92\\xa9");
# define TESTS_PM_SUPPORT_HELPER(name, function) \ # define TESTS_PM_SUPPORT_HELPER(name, function) \