From 832ee448ec543bcebcff391989963450c012dd80 Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Fri, 18 Nov 2005 21:02:36 +0000 Subject: [PATCH] fix --- ChangeLog | 7 +++++++ lib/mount.c | 29 ++++++++++++++++++++++++----- util/fusermount.c | 21 +++++++++++++++++++++ 3 files changed, 52 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 51b6a19..1d23050 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,13 @@ * More FreeBSD merge + * fusermount: don't allow mountpoints with '\n', '\t', or '\\' in + them, because it corrupts /etc/mtab. Found by Thomas Biege + + * libfuse: don't use system() to invoke 'fusermount -u ...' + because it breaks mountpoints with spaces in them into multiple + arguments + 2005-11-16 Miklos Szeredi * Merge library part of FreeBSD port. Patch by Csaba Henk diff --git a/lib/mount.c b/lib/mount.c index 62e2b4a..787c448 100644 --- a/lib/mount.c +++ b/lib/mount.c @@ -70,13 +70,32 @@ static int receive_fd(int fd) void fuse_unmount(const char *mountpoint) { const char *mountprog = FUSERMOUNT_PROG; - char umount_cmd[1024]; + int pid; - snprintf(umount_cmd, sizeof(umount_cmd) - 1, "%s -u -q -z -- %s", - mountprog, mountpoint); +#ifdef HAVE_FORK + pid = fork(); +#else + pid = vfork(); +#endif + if(pid == -1) + return; + + if(pid == 0) { + const char *argv[32]; + int a = 0; - umount_cmd[sizeof(umount_cmd) - 1] = '\0'; - system(umount_cmd); + argv[a++] = mountprog; + argv[a++] = "-u"; + argv[a++] = "-q"; + argv[a++] = "-z"; + argv[a++] = "--"; + argv[a++] = mountpoint; + argv[a++] = NULL; + + execvp(mountprog, (char **) argv); + exit(1); + } + waitpid(pid, NULL, 0); } int fuse_mount(const char *mountpoint, const char *opts) diff --git a/util/fusermount.c b/util/fusermount.c index 742a25f..8d5562e 100644 --- a/util/fusermount.c +++ b/util/fusermount.c @@ -120,6 +120,23 @@ static void unlock_mtab(int mtablock) } } +/* Glibc addmntent() doesn't encode '\n', misencodes '\t' as '\n' + (version 2.3.2), and encodes '\\' differently as mount(8). So + let's not allow those characters, they are not all that usual in + filenames. */ +static int check_name(const char *name) +{ + char *s; + for (s = "\n\t\\"; *s; s++) { + if (strchr(name, *s)) { + fprintf(stderr, "%s: illegal character 0x%02x in mount entry\n", + progname, *s); + return -1; + } + } + return 0; +} + static int add_mount(const char *fsname, const char *mnt, const char *type, const char *opts) { @@ -128,6 +145,10 @@ static int add_mount(const char *fsname, const char *mnt, const char *type, struct mntent ent; FILE *fp; + if (check_name(fsname) == -1 || check_name(mnt) == -1 || + check_name(type) == -1 || check_name(opts) == -1) + return -1; + fp = setmntent(mtab, "a"); if (fp == NULL) { fprintf(stderr, "%s: failed to open %s: %s\n", progname, mtab, -- 2.30.2