Ian,

We've been hearing some reports of autofs removing entire home directories when mounts expire. It appears that this could be some sort of race condition in the walk_tree code, where when the function starts the directory is unmounted and then autofs unlinks files in the the directory that is supposed to be umounted. I've attached a patch to the rm_unwanted_fn which adds some additional checks before we unlink anything, and it prevents autofs from unlinking files (since I'm pretty sure that autofs never creates a regular file). Let me know what you think.

Thanks,
Chris
--- autofs-4.1.4/daemon/automount.c.no-unlink   2005-07-11 13:28:57.000000000 
-0500
+++ autofs-4.1.4/daemon/automount.c     2005-07-11 13:50:46.000000000 -0500
@@ -216,16 +216,38 @@ static int walk_tree(const char *base, i
 static int rm_unwanted_fn(const char *file, const struct stat *st, int when, 
void *arg)
 {
        int rmsymlink = *(int *) arg;
+       struct stat newst;
 
        if (when == 0) {
                if (st->st_dev != ap.dev)
                        return 0;
-       } else {
-               info("rm_unwanted: %s\n", file);
-               if (S_ISDIR(st->st_mode))
-                       rmdir(file);
-               else if (!S_ISLNK(st->st_mode) || rmsymlink)
-                       unlink(file);
+               return 1;
+       }
+
+       if (lstat(file, &newst)) {
+               crit ("rm_unwanted: unable to stat file, possible race "
+                     "condition.");
+               return 0;
+       }
+
+       if (newst.st_dev != ap.dev) {
+               crit ("rm_unwanted: file %s has the wrong device, possible "
+                     "race condition.",file);
+               return 0;
+       }
+
+       if (S_ISDIR(newst.st_mode)) {
+               if (rmdir(file)) {
+                       info ("rm_unwanted: unable to remove directory"
+                             " %s", file);
+                       return 0;
+               }
+       } else if (S_ISREG(newst.st_mode)) {
+               crit ("rm_unwanted: attempting to remove files from a mounted "
+                     "directory.");
+               return 0;
+       } else if (S_ISLNK(newst.st_mode) && rmsymlink) {
+               unlink(file);
        }
 
        return 1;
_______________________________________________
autofs mailing list
[email protected]
http://linux.kernel.org/mailman/listinfo/autofs

Reply via email to