diff options
author | Kay Sievers <kay@vrfy.org> | 2012-06-04 14:57:24 +0200 |
---|---|---|
committer | Kay Sievers <kay@vrfy.org> | 2012-06-04 14:57:24 +0200 |
commit | 4b7126538c25268c79ff10d166920934f149a329 (patch) | |
tree | b0bd5148397e52687badf321cea015e138dfaa30 /src/shared/unit-name.c | |
parent | cabe5d25640914be1000d23bcdd29d2ffc6333de (diff) |
unit-name: never create a unit name with a leading '.'
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 '.'.
Diffstat (limited to 'src/shared/unit-name.c')
-rw-r--r-- | src/shared/unit-name.c | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/src/shared/unit-name.c b/src/shared/unit-name.c index e0a18d1357..1440d2f2ea 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 |