]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ntfs3: reject inodes with zero non-DOS link count
authorZiyi Guo <n7l8m4@u.northwestern.edu>
Tue, 10 Feb 2026 15:56:34 +0000 (15:56 +0000)
committerKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
Tue, 24 Feb 2026 19:03:14 +0000 (20:03 +0100)
ntfs_read_mft() counts file name attributes into two variables:
names (all names including DOS 8.3) and links (non-DOS names
only). The validation at line 424 checks names but set_nlink()
at line 436 uses links. A corrupted NTFS image where all file
name attributes have type FILE_NAME_DOS passes the names check
but results in set_nlink(inode, 0).

When such an inode is loaded via a code path that passes name=NULL
to ntfs_iget5() and the nlink=0 inode enters the VFS. The subsequent
unlink, rmdir, or rename targeting this inode calls drop_nlink()
which triggers WARN_ON(inode->i_nlink == 0) in fs/inode.c.

An all-DOS-name MFT record cannot exist on a valid NTFS volume.
Reject such records by checking for links == 0 before
calling set_nlink().

Signed-off-by: Ziyi Guo <n7l8m4@u.northwestern.edu>
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
fs/ntfs3/inode.c

index 6e65066ebcc1ae81d3bfdd14f4babfc2898b075e..398913595a55181f544ef880ce38014430f1c42b 100644 (file)
@@ -432,6 +432,11 @@ end_enum:
                ni->mi.dirty = true;
        }
 
+       if (!links) {
+               err = -EINVAL;
+               goto out;
+       }
+
        set_nlink(inode, links);
 
        if (S_ISDIR(mode)) {