aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiklos Szeredi <miklos@szeredi.hu>2005-11-18 21:02:36 +0000
committerMiklos Szeredi <miklos@szeredi.hu>2005-11-18 21:02:36 +0000
commit832ee448ec543bcebcff391989963450c012dd80 (patch)
tree3dddf1848c71aafc5b21550ed7e87d4c34607d79
parent9c2ccb43c3cc960334e2ab0069501dc583c7dbf7 (diff)
downloadlibfuse-832ee448ec543bcebcff391989963450c012dd80.tar.gz
fix
-rw-r--r--ChangeLog7
-rw-r--r--lib/mount.c29
-rw-r--r--util/fusermount.c21
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 <miklos@szeredi.hu>
* 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,