Skip to content

Commit f7edab0

Browse files
LiBaokun96aalexandrovich
authored andcommitted
fs/ntfs3: fix ntfs_mount_options leak in ntfs_fill_super()
In ntfs_fill_super(), the fc->fs_private pointer is set to NULL without first freeing the memory it points to. This causes the subsequent call to ntfs_fs_free() to skip freeing the ntfs_mount_options structure. This results in a kmemleak report: unreferenced object 0xff1100015378b800 (size 32): comm "mount", pid 582, jiffies 4294890685 hex dump (first 32 bytes): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00 00 00 00 00 00 00 00 ed ff ed ff 00 04 00 00 ................ backtrace (crc ed541d8c): __kmalloc_cache_noprof+0x424/0x5a0 __ntfs_init_fs_context+0x47/0x590 alloc_fs_context+0x5d8/0x960 __x64_sys_fsopen+0xb1/0x190 do_syscall_64+0x50/0x1f0 entry_SYSCALL_64_after_hwframe+0x76/0x7e This issue can be reproduced using the following commands: fallocate -l 100M test.file mount test.file /tmp/test Since sbi->options is duplicated from fc->fs_private and does not directly use the memory allocated for fs_private, it is unnecessary to set fc->fs_private to NULL. Additionally, this patch simplifies the code by utilizing the helper function put_mount_options() instead of open-coding the cleanup logic. Reported-by: syzbot+23aee7afc440fe803545@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=23aee7afc440fe803545 Fixes: aee4d5a ("ntfs3: fix double free of sbi->options->nls and clarify ownership of fc->fs_private") Signed-off-by: Baokun Li <libaokun1@huawei.com> Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
1 parent dffc7f2 commit f7edab0

1 file changed

Lines changed: 2 additions & 7 deletions

File tree

fs/ntfs3/super.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -705,9 +705,7 @@ static void ntfs_put_super(struct super_block *sb)
705705
ntfs_set_state(sbi, NTFS_DIRTY_CLEAR);
706706

707707
if (sbi->options) {
708-
unload_nls(sbi->options->nls);
709-
kfree(sbi->options->nls_name);
710-
kfree(sbi->options);
708+
put_mount_options(sbi->options);
711709
sbi->options = NULL;
712710
}
713711

@@ -1253,7 +1251,6 @@ static int ntfs_fill_super(struct super_block *sb, struct fs_context *fc)
12531251
}
12541252
}
12551253
sbi->options = options;
1256-
fc->fs_private = NULL;
12571254
sb->s_flags |= SB_NODIRATIME;
12581255
sb->s_magic = 0x7366746e; // "ntfs"
12591256
sb->s_op = &ntfs_sops;
@@ -1677,9 +1674,7 @@ static int ntfs_fill_super(struct super_block *sb, struct fs_context *fc)
16771674
out:
16781675
/* sbi->options == options */
16791676
if (options) {
1680-
unload_nls(options->nls);
1681-
kfree(options->nls_name);
1682-
kfree(options);
1677+
put_mount_options(sbi->options);
16831678
sbi->options = NULL;
16841679
}
16851680

0 commit comments

Comments
 (0)