Gitweb: http://git.fedorahosted.org/git/gfs2-utils.git?p=gfs2-utils.git;a=commitdiff... Commit: 3381f38d309e7d6b30718b563044fad0ea5846f7 Parent: cfbae22fc04d28031669de0a3f3aba5916c90465 Author: Lon Hohberger lhh@redhat.com AuthorDate: Mon Apr 26 15:33:57 2010 -0400 Committer: Bob Peterson rpeterso@redhat.com CommitterDate: Mon Sep 13 12:45:06 2010 -0500
gfs2: Fix handling of mount points with spaces
Mount points may contain spaces, tabs, newlines, and the backslash character according to getmntent(3). Unfortunately, while scanning /proc/mounts, mount.gfs2 was not unescaping the escape sequences, causing mount.gfs2 to not update mtab if a mount point contained any of these characters.
Utilities relying on mtab (e.g. fuser) would consequently be unable to list processes holding references on the mount point.
Resolves: rhbz#586100
Signed-off-by: Lon Hohberger lhh@redhat.com Signed-off-by: David Teigland teigland@redhat.com Signed-off-by: Steven Whitehouse swhiteho@redhat.com --- gfs2/mount/util.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 53 insertions(+), 2 deletions(-)
diff --git a/gfs2/mount/util.c b/gfs2/mount/util.c index 42cd8f0..891f475 100644 --- a/gfs2/mount/util.c +++ b/gfs2/mount/util.c @@ -203,6 +203,48 @@ void parse_opts(struct mount_options *mo) log_debug("parse_opts: locktable = "%s"", mo->locktable); }
+/* Remove escape sequences from mount path. Per getmntent(3), there are + only four escape sequences we need to handle. Consequently, this does + not need to be a general-purpose unescape function */ + +static int mnt_unescape(char *dest, size_t len, const char *src) +{ + unsigned i = 0, j = 0; + size_t srclen; + int ret = -1; + + srclen = strlen(src); + while (i < srclen) { + if (src[i] != '\') { + dest[j] = src[i]; + ++i; ++j; + continue; + } + + ++i; + if ((srclen - 3) < i) + return -1; + + if (!strncmp(&src[i], "040", 3)) { + dest[j] = ' '; + } else if (!strncmp(&src[i], "011", 3)) { + dest[j] = '\t'; + } else if (!strncmp(&src[i], "012", 3)) { + dest[j] = '\n'; + } else if (!strncmp(&src[i], "134", 3)) { + dest[j] = '\'; + } else { + return -1; + } + + i+=3; + j++; + } + + return 0; +} + + /* - when unmounting, we don't know the dev and need this function to set it; we also want to select the _last_ line with a matching dir since it will be the top-most fs that the umount(2) will unmount @@ -214,6 +256,7 @@ void read_proc_mounts(struct mount_options *mo) FILE *file; char line[PATH_MAX]; char path[PATH_MAX]; + char unescaped_path[PATH_MAX]; char type[PATH_MAX]; char opts[PATH_MAX]; char device[PATH_MAX]; @@ -236,8 +279,16 @@ void read_proc_mounts(struct mount_options *mo) while (fgets(line, PATH_MAX, file)) { if (sscanf(line, "%s %s %s %s", device, path, type, opts) != 4) continue; - if (strcmp(path, mo->dir)) - continue; + if (strcmp(path, mo->dir)) { + if (!strchr(path, '\')) + continue; + /* /proc/mounts entry may have escaped spaces */ + if (mnt_unescape(unescaped_path, sizeof(unescaped_path), + path) < 0) + continue; + if (strcmp(unescaped_path, mo->dir)) + continue; + } if (mo->dev[0]) { if (stat(device, &st_mounts_dev)) continue;
cluster-commits@lists.fedorahosted.org