]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
Fix a drop_nlink warning in minix_rename
authorJori Koolstra <jkoolstra@xs4all.nl>
Tue, 4 Nov 2025 14:30:05 +0000 (15:30 +0100)
committerChristian Brauner <brauner@kernel.org>
Wed, 5 Nov 2025 12:45:21 +0000 (13:45 +0100)
Syzbot found a drop_nlink warning that is triggered by an easy to
detect nlink corruption. This patch adds sanity checks to minix_unlink
and minix_rename to prevent the warning and instead return EFSCORRUPTED
to the caller.

The changes were tested using the syzbot reproducer as well as local
testing.

Signed-off-by: Jori Koolstra <jkoolstra@xs4all.nl>
Link: https://patch.msgid.link/20251104143005.3283980-4-jkoolstra@xs4all.nl
Reviewed-by: Jan Kara <jack@suse.cz>
Reported-by: syzbot+a65e824272c5f741247d@syzkaller.appspotmail.com
Closes: https://syzbot.org/bug?extid=a65e824272c5f741247d
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/minix/namei.c

index 68d2dd75b97fb6bc773b08e9ba0e647cad299c81..263e4ba8b1c822c388070a9ed3e123f272fcbe61 100644 (file)
@@ -145,6 +145,11 @@ static int minix_unlink(struct inode * dir, struct dentry *dentry)
        struct minix_dir_entry * de;
        int err;
 
+       if (inode->i_nlink == 0) {
+               minix_error_inode(inode, "inode has corrupted nlink");
+               return -EFSCORRUPTED;
+       }
+
        de = minix_find_entry(dentry, &folio);
        if (!de)
                return -ENOENT;
@@ -217,6 +222,17 @@ static int minix_rename(struct mnt_idmap *idmap,
                if (dir_de && !minix_empty_dir(new_inode))
                        goto out_dir;
 
+               err = -EFSCORRUPTED;
+               if (new_inode->i_nlink == 0 || (dir_de && new_inode->i_nlink != 2)) {
+                       minix_error_inode(new_inode, "inode has corrupted nlink");
+                       goto out_dir;
+               }
+
+               if (dir_de && old_dir->i_nlink <= 2) {
+                       minix_error_inode(old_dir, "inode has corrupted nlink");
+                       goto out_dir;
+               }
+
                err = -ENOENT;
                new_de = minix_find_entry(new_dentry, &new_folio);
                if (!new_de)