Skip to content

Commit e10e72f

Browse files
haruki3hhhaalexandrovich
authored andcommitted
ntfs3: reject inodes with zero non-DOS link count
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>
1 parent 6de23f8 commit e10e72f

1 file changed

Lines changed: 5 additions & 0 deletions

File tree

fs/ntfs3/inode.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,11 @@ static struct inode *ntfs_read_mft(struct inode *inode,
432432
ni->mi.dirty = true;
433433
}
434434

435+
if (!links) {
436+
err = -EINVAL;
437+
goto out;
438+
}
439+
435440
set_nlink(inode, links);
436441

437442
if (S_ISDIR(mode)) {

0 commit comments

Comments
 (0)