diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mount.c | 18 | ||||
-rw-r--r-- | src/util.c | 13 | ||||
-rw-r--r-- | src/util.h | 2 |
3 files changed, 30 insertions, 3 deletions
diff --git a/src/mount.c b/src/mount.c index e0ca5bb5d0..ac33787e61 100644 --- a/src/mount.c +++ b/src/mount.c @@ -1175,7 +1175,7 @@ fail: } static char *fstab_node_to_udev_node(char *p) { - char *dn, *t; + char *dn, *t, *u; int r; /* FIXME: to follow udev's logic 100% we need to leave valid @@ -1183,7 +1183,13 @@ static char *fstab_node_to_udev_node(char *p) { if (startswith(p, "LABEL=")) { - if (!(t = xescape(p+6, "/ "))) + if (!(u = unquote(p+6, '"'))) + return NULL; + + t = xescape(u, "/ "); + free(u); + + if (!t) return NULL; r = asprintf(&dn, "/dev/disk/by-label/%s", t); @@ -1197,7 +1203,13 @@ static char *fstab_node_to_udev_node(char *p) { if (startswith(p, "UUID=")) { - if (!(t = xescape(p+5, "/ "))) + if (!(u = unquote(p+5, '"'))) + return NULL; + + t = xescape(u, "/ "); + free(u); + + if (!t) return NULL; r = asprintf(&dn, "/dev/disk/by-uuid/%s", ascii_strlower(t)); diff --git a/src/util.c b/src/util.c index 7903ca07b9..f1a7bbdc71 100644 --- a/src/util.c +++ b/src/util.c @@ -3004,6 +3004,19 @@ int touch(const char *path) { return 0; } +char *unquote(const char *s, const char quote) { + size_t l; + assert(s); + + if ((l = strlen(s)) < 2) + return strdup(s); + + if (s[0] == quote && s[l-1] == quote) + return strndup(s+1, l-2); + + return strdup(s); +} + static const char *const ioprio_class_table[] = { [IOPRIO_CLASS_NONE] = "none", [IOPRIO_CLASS_RT] = "realtime", diff --git a/src/util.h b/src/util.h index 7490236fa0..4063ee7ff2 100644 --- a/src/util.h +++ b/src/util.h @@ -339,6 +339,8 @@ char *ellipsize(const char *s, unsigned length, unsigned percent); int touch(const char *path); +char *unquote(const char *s, const char quote); + #define NULSTR_FOREACH(i, l) \ for ((i) = (l); (i) && *(i); (i) = strchr((i), 0)+1) |