]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fs/ntfs3: prevent potential lcn remains uninitialized
authorEdward Adam Davis <eadavis@qq.com>
Tue, 26 May 2026 08:08:04 +0000 (16:08 +0800)
committerKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
Wed, 10 Jun 2026 10:36:51 +0000 (12:36 +0200)
The target VCN being sought was not found within runs[0], causing
run_lookup() to return false. This causes run_lookup_entry() to return
false, which in turn results in a len value of 0, and the new parameter
passed to attr_data_get_block() is NULL. Collectively, these factors
ultimately cause attr_data_get_block_locked() to exit prematurely without
initializing lcn, thereby triggering [1].

To prevent [1], the clen check within ni_seek_data_or_hole() has been
moved to occur before the lcn check.

[1]
BUG: KMSAN: uninit-value in ni_seek_data_or_hole+0x24f/0x5f0 fs/ntfs3/frecord.c:2862
 ni_seek_data_or_hole+0x24f/0x5f0 fs/ntfs3/frecord.c:2862
 ntfs_llseek+0x22a/0x4a0 fs/ntfs3/file.c:1530
 vfs_llseek fs/read_write.c:391 [inline]

Fixes: c61326967728 ("fs/ntfs3: implement llseek SEEK_DATA/SEEK_HOLE by scanning data runs")
Reported-by: syzbot+c2cfe997245202e46f10@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=c2cfe997245202e46f10
Signed-off-by: Edward Adam Davis <eadavis@qq.com>
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
fs/ntfs3/frecord.c

index abab45f6f18029d9ad283a7a825a950c82af57d3..2b49bc0775582e69bb92f4e485bd000676016651 100644 (file)
@@ -2859,6 +2859,11 @@ loff_t ni_seek_data_or_hole(struct ntfs_inode *ni, loff_t offset, bool data)
                        return err;
                }
 
+               if (!clen) {
+                       /* Corrupted file. */
+                       return -EINVAL;
+               }
+
                if (lcn == RESIDENT_LCN) {
                        /* clen - resident size in bytes. clen == ni->vfs_inode.i_size */
                        if (offset >= clen) {
@@ -2915,10 +2920,6 @@ loff_t ni_seek_data_or_hole(struct ntfs_inode *ni, loff_t offset, bool data)
                        }
                }
 
-               if (!clen) {
-                       /* Corrupted file. */
-                       return -EINVAL;
-               }
        }
 
        vbo = (u64)vcn << cluster_bits;