a19a3f
From aad98b87513f9e277258c8bc9c3bc7db7a8442ba Mon Sep 17 00:00:00 2001
a19a3f
From: Vojtech Trefny <vtrefny@redhat.com>
a19a3f
Date: Thu, 18 Jan 2018 13:59:11 +0100
a19a3f
Subject: [PATCH] Fix escaping mountpoint for the cleanup service
a19a3f
a19a3f
We need to use the 'systemd-escape' command -- it escapes more
a19a3f
symbols and manually escaping only slashes isn't enough.
a19a3f
a19a3f
Resolves: rhbz#1384796
a19a3f
(cherry picked from commit 4d982bb6b81afcd17b0a42b6c1256c22ff444ee5)
a19a3f
---
a19a3f
 src/udiskslinuxfilesystem.c | 38 +++++++++++++++++++++++++++-----------
a19a3f
 1 file changed, 27 insertions(+), 11 deletions(-)
a19a3f
a19a3f
diff --git a/src/udiskslinuxfilesystem.c b/src/udiskslinuxfilesystem.c
a19a3f
index 2910181..e2b7e18 100644
a19a3f
--- a/src/udiskslinuxfilesystem.c
a19a3f
+++ b/src/udiskslinuxfilesystem.c
a19a3f
@@ -1144,10 +1144,11 @@ is_system_managed (UDisksBlock  *block,
a19a3f
 
a19a3f
 static void trigger_mpoint_cleanup (const gchar *mount_point)
a19a3f
 {
a19a3f
-  const gchar *argv[] = {"systemctl", "start", NULL, NULL};
a19a3f
+  const gchar *service_argv[] = {"systemctl", "start", NULL, NULL};
a19a3f
+  const gchar *escape_argv[] = {"systemd-escape", NULL, NULL};
a19a3f
   GError *error = NULL;
a19a3f
   gchar *escaped_mpoint = NULL;
a19a3f
-  gsize len = 0;
a19a3f
+  size_t len = 0;
a19a3f
 
a19a3f
   if (g_str_has_prefix (mount_point, "/"))
a19a3f
     mount_point++;
a19a3f
@@ -1155,14 +1156,27 @@ static void trigger_mpoint_cleanup (const gchar *mount_point)
a19a3f
     udisks_warning ("Invalid mount point given to trigger_mpoint_cleanup(): %s",
a19a3f
                     mount_point);
a19a3f
 
a19a3f
-  /* start with the mount point without the leading '/' */
a19a3f
-  escaped_mpoint = g_strdup (mount_point);
a19a3f
+  /* use 'systemd-escape' to escape the mountpoint */
a19a3f
+  escape_argv[1] = g_strdup (mount_point);
a19a3f
 
a19a3f
-  /* and replace all '/'s with '-'s */
a19a3f
-  for (gchar *letter = escaped_mpoint; *letter != '\0'; letter++, len++)
a19a3f
+  if (!bd_utils_exec_and_capture_output (escape_argv, NULL, &escaped_mpoint, &error) && (error != NULL))
a19a3f
     {
a19a3f
-      if (*letter == '/')
a19a3f
-        *letter = '-';
a19a3f
+      /* this is a best-effort mechanism, if it fails, just log warning and move
a19a3f
+         on */
a19a3f
+      udisks_warning ("Failed to setup systemd-based mount point cleanup: %s",
a19a3f
+                      error->message);
a19a3f
+      g_clear_error (&error);
a19a3f
+      goto out;
a19a3f
+    }
a19a3f
+
a19a3f
+  /* remove leading/trailing whitespace */
a19a3f
+  g_strstrip (escaped_mpoint);
a19a3f
+
a19a3f
+  len = strlen (escaped_mpoint);
a19a3f
+  if (len <= 0)
a19a3f
+    {
a19a3f
+      udisks_warning ("Failed to setup systemd-based mount point cleanup");
a19a3f
+      goto out;
a19a3f
     }
a19a3f
 
a19a3f
   /* remove the potential trailing '-' (would happen if the given mount_point
a19a3f
@@ -1170,9 +1184,9 @@ static void trigger_mpoint_cleanup (const gchar *mount_point)
a19a3f
   if (escaped_mpoint[len - 1] == '-')
a19a3f
     escaped_mpoint[len - 1] = '\0';
a19a3f
 
a19a3f
-  argv[2] = g_strdup_printf ("clean-mount-point@%s", escaped_mpoint);
a19a3f
+  service_argv[2] = g_strdup_printf ("clean-mount-point@%s", escaped_mpoint);
a19a3f
 
a19a3f
-  if (!bd_utils_exec_and_report_error (argv, NULL, &error) && (error != NULL))
a19a3f
+  if (!bd_utils_exec_and_report_error (service_argv, NULL, &error) && (error != NULL))
a19a3f
     {
a19a3f
       /* this is a best-effort mechanism, if it fails, just log warning and move
a19a3f
          on */
a19a3f
@@ -1181,8 +1195,10 @@ static void trigger_mpoint_cleanup (const gchar *mount_point)
a19a3f
       g_clear_error (&error);
a19a3f
     }
a19a3f
 
a19a3f
+out:
a19a3f
   g_free (escaped_mpoint);
a19a3f
-  g_free ((gchar *) argv[2]);
a19a3f
+  g_free ((gchar *) service_argv[2]);
a19a3f
+  g_free ((gchar *) escape_argv[1]);
a19a3f
 }
a19a3f
 
a19a3f
 /* ---------------------------------------------------------------------------------------------------- */
a19a3f
-- 
a19a3f
1.8.3.1
a19a3f