[libvirt] [PATCH] systemd: Escape only needed characters for machined

Martin Kletzander mkletzan at redhat.com
Fri Nov 27 13:59:51 UTC 2015


My previous fix in commit e24eda48cfae84a9003456b68eaf753a26123639 was
incomplete, or rather more complete than it needed to be.  The problem
is that even though machined requires non-ASCII characters to be escaped
does not mean that it needs to follow the exact same rules as unit files
and services, therefore rendering our escape function, namely
virSystemdEscapeName(), as overkill.  Well, that should not be a
problem, because if we escape more than needed, it will not break
anything.  However, that is not the case with current release of systemd
because even though it requires some characters to be escaped, *any*
escaped character will cause the function to fail.  Even though that
will be fixed, we need to make sure that machines, which were able to
start before the commit mentioned above, are still able to start now.
So this patch changes virSystemdEscapeName() to operate as the
aforementioned overkill merely based on its new parameter.  If that
parameter is false, which only occurs in the latest call to this
function from virSystemdMakeMachineName(), it will not escape characters
that would cause the machine being unable to be started.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1282846

Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
---
 src/util/virsystemd.c  | 15 ++++++++-------
 tests/virsystemdtest.c |  4 ++--
 2 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/src/util/virsystemd.c b/src/util/virsystemd.c
index abd883c73844..257efaab7829 100644
--- a/src/util/virsystemd.c
+++ b/src/util/virsystemd.c
@@ -39,7 +39,8 @@
 VIR_LOG_INIT("util.systemd");

 static void virSystemdEscapeName(virBufferPtr buf,
-                                 const char *name)
+                                 const char *name,
+                                 bool full_escape)
 {
     static const char hextable[16] = "0123456789abcdef";

@@ -57,7 +58,7 @@ static void virSystemdEscapeName(virBufferPtr buf,
         "ABCDEFGHIJKLMNOPQRSTUVWXYZ"            \
         ":-_.\\"

-    if (*name == '.') {
+    if (full_escape && *name == '.') {
         ESCAPE(*name);
         name++;
     }
@@ -65,7 +66,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 +86,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 +105,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 +131,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 06fec5495bc2..49d37c2032ec 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)                        \
-- 
2.6.3




More information about the libvir-list mailing list