mirror of https://gitee.com/openkylin/libvirt.git
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:
parent
baa3b463b3
commit
0e0149ce91
|
@ -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:
|
||||||
|
|
|
@ -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) \
|
||||||
|
|
Loading…
Reference in New Issue