[CRIU] [PATCH 2/4] mount: decode paths from mountinfo
Andrey Vagin
avagin at openvz.org
Fri Jul 17 03:49:51 PDT 2015
mountinfo contains mangled paths. space, tab and back slash were
replaced with usual octal escape, so we need to replace these charecter
back.
Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
proc_parse.c | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/proc_parse.c b/proc_parse.c
index fc2e371..0fa2afe 100644
--- a/proc_parse.c
+++ b/proc_parse.c
@@ -988,6 +988,37 @@ static int parse_mnt_opt(char *str, struct mount_info *mi, int *off)
return 0;
}
+/*
+ * mountinfo contains mangled paths. space, tab and back slash were replaced
+ * with usual octal escape. This function replaces these symbols back.
+ */
+void cure_path(char *path) { int i, len, off = 0;
+
+ if (strchr(path, '\\') == NULL) /* fast path */
+ return;
+
+ len = strlen(path);
+ for (i = 0; i < len; i++) {
+ if (!strncmp(path + i, "\\040", 4)) {
+ path[i - off] = ' ';
+ goto replace;
+ } else if (!strncmp(path + i, "\\011", 4)) {
+ path[i - off] = '\t';
+ goto replace;
+ } else if (!strncmp(path + i, "\\134", 4)) {
+ path[i - off] = '\\';
+ goto replace;
+ }
+ if (off)
+ path[i - off] = path[i];
+ continue;
+replace:
+ off += 3;
+ i += 3;
+ }
+ path[len - off] = 0;
+}
+
static int parse_mountinfo_ent(char *str, struct mount_info *new, char **fsname)
{
unsigned int kmaj, kmin;
@@ -1006,6 +1037,9 @@ static int parse_mountinfo_ent(char *str, struct mount_info *new, char **fsname)
if (ret != 7)
goto err;
+ cure_path(new->mountpoint);
+ cure_path(new->root);
+
new->mountpoint = xrealloc(new->mountpoint, strlen(new->mountpoint) + 1);
if (!new->mountpoint)
goto err;
@@ -1034,6 +1068,8 @@ static int parse_mountinfo_ent(char *str, struct mount_info *new, char **fsname)
goto err;
}
+ cure_path(new->source);
+
/*
* The kernel reports "subtypes" sometimes and the valid
* type-vs-subtype delimiter is the dot symbol. We disregard
--
2.1.0
More information about the CRIU
mailing list