Sophie

Sophie

distrib > Fedora > 17 > i386 > media > updates-src > by-pkgid > ab4b662b9827b6375ffd451bf4abd615 > files > 394

systemd-44-24.fc17.src.rpm

From d69ab4923308c5010ffa0da3e6be882af03b0cc7 Mon Sep 17 00:00:00 2001
From: Kay Sievers <kay@vrfy.org>
Date: Mon, 4 Jun 2012 14:57:24 +0200
Subject: [PATCH] unit-name: never create a unit name with a leading '.'
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Supposed to prevent creating unit files like:
  ├── dev-sda1.device.wants
  │   └── .dot.mount -> /run/systemd/generator/.dot.mount
  ├── .dot.mount
from:
  # cat /etc/fstab
  /dev/sda1    /.dot           vfat ro           1 3

which we later skip reading because of the leading '.'.
(cherry picked from commit 4b7126538c25268c79ff10d166920934f149a329)
---
 src/shared/unit-name.c |   29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

diff --git a/src/shared/unit-name.c b/src/shared/unit-name.c
index 05baa4a..b74ab29 100644
--- a/src/shared/unit-name.c
+++ b/src/shared/unit-name.c
@@ -179,19 +179,30 @@ char *unit_name_build(const char *prefix, const char *instance, const char *suff
         return join(prefix, "@", instance, suffix, NULL);
 }
 
-static char* do_escape(const char *f, char *t) {
+static char *do_escape_char(char c, char *t) {
+        *(t++) = '\\';
+        *(t++) = 'x';
+        *(t++) = hexchar(c >> 4);
+        *(t++) = hexchar(c);
+        return t;
+}
+
+static char *do_escape(const char *f, char *t) {
         assert(f);
         assert(t);
 
+        /* do not create units with a leading '.', like for "/.dotdir" mount points */
+        if (*f == '.') {
+                t = do_escape_char(*f, t);
+                f++;
+        }
+
         for (; *f; f++) {
                 if (*f == '/')
                         *(t++) = '-';
-                else if (*f == '-' || *f == '\\' || !strchr(VALID_CHARS, *f)) {
-                        *(t++) = '\\';
-                        *(t++) = 'x';
-                        *(t++) = hexchar(*f >> 4);
-                        *(t++) = hexchar(*f);
-                } else
+                else if (*f == '-' || *f == '\\' || !strchr(VALID_CHARS, *f))
+                        t = do_escape_char(*f, t);
+                else
                         *(t++) = *f;
         }
 
@@ -209,8 +220,8 @@ char *unit_name_build_escape(const char *prefix, const char *instance, const cha
          * suffix and makes a nice string suitable as unit name of it,
          * escaping all weird chars on the way.
          *
-         * / becomes ., and all chars not allowed in a unit name get
-         * escaped as \xFF, including \ and ., of course. This
+         * / becomes -, and all chars not allowed in a unit name get
+         * escaped as \xFF, including \ and -, of course. This
          * escaping is hence reversible.
          *
          * This is primarily useful to make nice unit names from