Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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: aee4d5a521e9 ("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>

authored by

Baokun Li and committed by
Konstantin Komarov
f7edab0c dffc7f2f

+2 -7
+2 -7
fs/ntfs3/super.c
··· 705 705 ntfs_set_state(sbi, NTFS_DIRTY_CLEAR); 706 706 707 707 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); 711 709 sbi->options = NULL; 712 710 } 713 711 ··· 1251 1253 } 1252 1254 } 1253 1255 sbi->options = options; 1254 - fc->fs_private = NULL; 1255 1256 sb->s_flags |= SB_NODIRATIME; 1256 1257 sb->s_magic = 0x7366746e; // "ntfs" 1257 1258 sb->s_op = &ntfs_sops; ··· 1674 1677 out: 1675 1678 /* sbi->options == options */ 1676 1679 if (options) { 1677 - unload_nls(options->nls); 1678 - kfree(options->nls_name); 1679 - kfree(options); 1680 + put_mount_options(sbi->options); 1680 1681 sbi->options = NULL; 1681 1682 } 1682 1683