Hi,
There have been cases where broken kernels resulted in autofs removing
regular files on non-autofs file systems. This should be avoided at all
costs. This patch adds some paranoia checks to the rm_unwanted_fn.
Comments are welcome.
-Jeff
diff --git a/daemon/automount.c b/daemon/automount.c
index 348b499..eb0cdd3 100644
--- a/daemon/automount.c
+++ b/daemon/automount.c
@@ -262,16 +262,42 @@ 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: %s", strerror(errno));
+ 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, error: %s", file, strerror(errno));
+ 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) {
+ if (unlink(file)) {
+ crit ("rm_unwanted: unable to remove link: %s, error: "
+ "%s", file, strerror(errno));
+ return 0;
+ }
}
return 1;
_______________________________________________
autofs mailing list
[email protected]
http://linux.kernel.org/mailman/listinfo/autofs