]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
ntfs: add check for mft record size in superblock
authorRustam Kovhaev <rkovhaev@gmail.com>
Tue, 13 Oct 2020 23:48:17 +0000 (16:48 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 14 Oct 2020 01:38:27 +0000 (18:38 -0700)
Number of bytes allocated for mft record should be equal to the mft record
size stored in ntfs superblock as reported by syzbot, userspace might
trigger out-of-bounds read by dereferencing ctx->attr in ntfs_attr_find()

Reported-by: syzbot+aed06913f36eff9b544e@syzkaller.appspotmail.com
Signed-off-by: Rustam Kovhaev <rkovhaev@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Tested-by: syzbot+aed06913f36eff9b544e@syzkaller.appspotmail.com
Acked-by: Anton Altaparmakov <anton@tuxera.com>
Link: https://syzkaller.appspot.com/bug?extid=aed06913f36eff9b544e
Link: https://lkml.kernel.org/r/20200824022804.226242-1-rkovhaev@gmail.com
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/ntfs/inode.c

index 9bb9f0952b1865a38a5224808a52ec0a6e13751e..caf563981532b5b74afbf00c2df8648b6da9ebef 100644 (file)
@@ -1810,6 +1810,12 @@ int ntfs_read_inode_mount(struct inode *vi)
                brelse(bh);
        }
 
+       if (le32_to_cpu(m->bytes_allocated) != vol->mft_record_size) {
+               ntfs_error(sb, "Incorrect mft record size %u in superblock, should be %u.",
+                               le32_to_cpu(m->bytes_allocated), vol->mft_record_size);
+               goto err_out;
+       }
+
        /* Apply the mst fixups. */
        if (post_read_mst_fixup((NTFS_RECORD*)m, vol->mft_record_size)) {
                /* FIXME: Try to use the $MFTMirr now. */