fixes
authorMiklos Szeredi <miklos@szeredi.hu>
Wed, 8 Aug 2007 18:22:01 +0000 (18:22 +0000)
committerMiklos Szeredi <miklos@szeredi.hu>
Wed, 8 Aug 2007 18:22:01 +0000 (18:22 +0000)
ChangeLog
lib/helper.c
lib/mount_util.c

index 2bf2251b87488c1abea53f1d6715e43271b7c79a..a184b14b39ea06068ea88076598869b34569ddc9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,8 +1,16 @@
+2007-07-31  Miklos Szeredi <miklos@szeredi.hu>
+
+       * Work around hotplug issue, that it calls filesystem with file
+       descriptors 0, 1 and 2 not open.  Tracked down by Leif Johnson
+
 2007-07-25  Miklos Szeredi <miklos@szeredi.hu>
 
        * Don't call /bin/[u]mount if /etc/mtab is a symlink.  Reported by
        Tomas M
 
+       * Also don't touch /etc/mtab if it is within the mounted
+       filesystem.  Suggested by Jeffrey Law
+
 2007-07-12  Miklos Szeredi <miklos@szeredi.hu>
 
        * Reset args->argc in fuse_opt_free_args().  Patch by Lucas
index d7cc9b7717e14c830f1b07557be2be7f7ab32d02..b282da9fcef3919092cca2b1c6f6694ab55a63c7 100644 (file)
@@ -190,7 +190,19 @@ static struct fuse_chan *fuse_mount_common(const char *mountpoint,
                                            struct fuse_args *args)
 {
     struct fuse_chan *ch;
-    int fd = fuse_mount_compat25(mountpoint, args);
+    int fd;
+
+    /*
+     * Make sure file descriptors 0, 1 and 2 are open, otherwise chaos
+     * would ensue.
+     */
+    do {
+        fd = open("/dev/null", O_RDWR);
+        if (fd > 2)
+            close(fd);
+    } while (fd >= 0 && fd <= 2);
+
+    fd = fuse_mount_compat25(mountpoint, args);
     if (fd == -1)
         return NULL;
 
index 55b5f4e3f32aa338585bca8eb5b02b44ea342de6..781a16a5ceb7082a61921b414884c85b9a42488f 100644 (file)
 #include <sys/stat.h>
 #include <sys/wait.h>
 
-static int mtab_is_symlink(void)
+static int mtab_needs_update(const char *mnt)
 {
     struct stat stbuf;
 
+    /* If mtab is within new mount, don't touch it */
+    if (strncmp(mnt, _PATH_MOUNTED, strlen(mnt)) == 0 &&
+        _PATH_MOUNTED[strlen(mnt)] == '/')
+        return 0;
+
     if (lstat(_PATH_MOUNTED, &stbuf) != -1 && S_ISLNK(stbuf.st_mode))
-        return 1;
-    else
         return 0;
+
+    return 1;
 }
 
 int fuse_mnt_add_mount(const char *progname, const char *fsname,
@@ -34,7 +39,7 @@ int fuse_mnt_add_mount(const char *progname, const char *fsname,
     int res;
     int status;
 
-    if (mtab_is_symlink())
+    if (!mtab_needs_update(mnt))
         return 0;
 
     res = fork();
@@ -86,7 +91,7 @@ int fuse_mnt_umount(const char *progname, const char *mnt, int lazy)
     int res;
     int status;
 
-    if (mtab_is_symlink())
+    if (!mtab_needs_update(mnt))
         return 0;
 
     res = fork();