Skip to content

Commit e98266e

Browse files
ea1davisaalexandrovich
authored andcommitted
fs/ntfs3: prevent uninitialized lcn caused by zero len
syzbot reported a uninit-value in ntfs_iomap_begin [1]. Since runs was not touched yet, run_lookup_entry() immediately fails and returns false, which makes the value of "*len" 0. Simultaneously, the new value and err value are also 0, causing the logic in attr_data_get_block_locked() to jump directly to ok, ultimately resulting in *lcn being triggered before it is set [1]. In ntfs_iomap_begin(), the check for a 0 value in clen is moved forward to before updating lcn to avoid this [1]. [1] BUG: KMSAN: uninit-value in ntfs_iomap_begin+0x8c0/0x1460 fs/ntfs3/inode.c:825 ntfs_iomap_begin+0x8c0/0x1460 fs/ntfs3/inode.c:825 iomap_iter+0x9b7/0x1540 fs/iomap/iter.c:110 Local variable lcn created at: ntfs_iomap_begin+0x15d/0x1460 fs/ntfs3/inode.c:786 Fixes: 10d7c95 ("fs/ntfs3: add delayed-allocation (delalloc) support") Reported-by: syzbot+7be88937363ac7ab7bb0@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=7be88937363ac7ab7bb0 Tested-by: syzbot+7be88937363ac7ab7bb0@syzkaller.appspotmail.com Signed-off-by: Edward Adam Davis <eadavis@qq.com> Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
1 parent 48d9b57 commit e98266e

1 file changed

Lines changed: 5 additions & 5 deletions

File tree

fs/ntfs3/inode.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -827,6 +827,11 @@ static int ntfs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
827827
return err;
828828
}
829829

830+
if (!clen) {
831+
/* broken file? */
832+
return -EINVAL;
833+
}
834+
830835
if (lcn == EOF_LCN) {
831836
/* request out of file. */
832837
if (flags & IOMAP_REPORT) {
@@ -860,11 +865,6 @@ static int ntfs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
860865
return 0;
861866
}
862867

863-
if (!clen) {
864-
/* broken file? */
865-
return -EINVAL;
866-
}
867-
868868
iomap->bdev = inode->i_sb->s_bdev;
869869
iomap->offset = offset;
870870
iomap->length = ((loff_t)clen << cluster_bits) - off;

0 commit comments

Comments
 (0)