This commit is contained in:
Miklos Szeredi
2005-11-18 21:02:36 +00:00
parent 9c2ccb43c3
commit 832ee448ec
3 changed files with 52 additions and 5 deletions
+7
View File
@@ -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
+24 -5
View File
@@ -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;
umount_cmd[sizeof(umount_cmd) - 1] = '\0';
system(umount_cmd);
if(pid == 0) {
const char *argv[32];
int a = 0;
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)
+21
View File
@@ -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,