udf: Detect system inodes linked into directory hierarchy
authorJan Kara <jack@suse.cz>
Tue, 3 Jan 2023 09:03:35 +0000 (10:03 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 10 Mar 2023 08:40:00 +0000 (09:40 +0100)
commit 85a37983ec69cc9fcd188bc37c4de15ee326355a upstream.

When UDF filesystem is corrupted, hidden system inodes can be linked
into directory hierarchy which is an avenue for further serious
corruption of the filesystem and kernel confusion as noticed by syzbot
fuzzed images. Refuse to access system inodes linked into directory
hierarchy and vice versa.

CC: stable@vger.kernel.org
Reported-by: syzbot+38695a20b8addcbc1084@syzkaller.appspotmail.com
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/udf/inode.c

index 7b5488f60aca316c4692bfdcae7c3c7886297860..0177f00ca3a97457c1b6b6391d11edb71029a0ee 100644 (file)
@@ -1897,8 +1897,13 @@ struct inode *__udf_iget(struct super_block *sb, struct kernel_lb_addr *ino,
        if (!inode)
                return ERR_PTR(-ENOMEM);
 
-       if (!(inode->i_state & I_NEW))
+       if (!(inode->i_state & I_NEW)) {
+               if (UDF_I(inode)->i_hidden != hidden_inode) {
+                       iput(inode);
+                       return ERR_PTR(-EFSCORRUPTED);
+               }
                return inode;
+       }
 
        memcpy(&UDF_I(inode)->i_location, ino, sizeof(struct kernel_lb_addr));
        err = udf_read_inode(inode, hidden_inode);