ext4: disallow hard-linked directory in ext4_lookup
authorAndreas Dilger <adilger@dilger.ca>
Mon, 28 May 2012 21:02:25 +0000 (17:02 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 28 May 2012 21:02:25 +0000 (17:02 -0400)
A hard-linked directory to its parent can cause the VFS to deadlock,
and is a sign of a corrupted file system.  So detect this case in
ext4_lookup(), before the rmdir() lockup scenario can take place.

Signed-off-by: Andreas Dilger <adilger@dilger.ca>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Cc: stable@kernel.org
fs/ext4/namei.c

index a9fd5f48f3bf56091c7c72f854313382f80de3ae..daf8260f0b03610fd482fb56086f4995972e39b0 100644 (file)
@@ -1330,6 +1330,12 @@ static struct dentry *ext4_lookup(struct inode *dir, struct dentry *dentry, stru
                        EXT4_ERROR_INODE(dir, "bad inode number: %u", ino);
                        return ERR_PTR(-EIO);
                }
+               if (unlikely(ino == dir->i_ino)) {
+                       EXT4_ERROR_INODE(dir, "'%.*s' linked to parent dir",
+                                        dentry->d_name.len,
+                                        dentry->d_name.name);
+                       return ERR_PTR(-EIO);
+               }
                inode = ext4_iget(dir->i_sb, ino);
                if (inode == ERR_PTR(-ESTALE)) {
                        EXT4_ERROR_INODE(dir,