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