fs/ntfs3: fix KMSAN uninit-value in ni_create_attr_list
PATCH 1/1 fs/ntfs3: fix KMSAN uninit-value in ni_create_attr_list
The call to kmalloc() to allocate the attribute list buffer is given a size of al_aligned(rs). This size can be larger than the data subsequently copied into the buffer, leaving trailing bytes uninitialized.
This can trigger a KMSAN "uninit-value" warning if that memory is later accessed.
Fix this by using kzalloc() instead, which ensures the entire allocated buffer is zero-initialized, preventing the warning.
---
The following syzbot test commands were used to verify the fix against both linux-next and a specific mainline commit. Both kernels were configured with CONFIG_KMSAN=y, and no KMSAN warnings were observed with the patch applied.
An attempt to test against the latest mainline tip failed due to an unrelated boot failure in the SCSI subsystem (KMSAN: use-after-free in scsi_get_vpd_buf). Therefore, testing was done on the last known-good mainline commit below.
For mainline commit 9b0d551bcc05 ("Merge tag 'pull-misc' of..."):
#syz test: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 9b0d551bcc05
For the linux-next branch:
#syz test: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
fs/ntfs3/frecord.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ntfs3/frecord.c +1 -1
@@ -767,7 +767,7 @@ int ni_create_attr_list(struct ntfs_inode *ni)* Skip estimating exact memory requirement. * Looks like one record_size is always enough. */ - le =kmalloc (al_aligned (rs),GFP_NOFS ); + le =kzalloc (al_aligned (rs),GFP_NOFS );if (!le)return -ENOMEM ;
Signature · 1 line
2.51.0
Re: [syzbot] [ntfs3?] KMSAN: uninit-value in attr_set_size
syzbot has tested the proposed patch and the reproducer did not trigger any issue:
Hello,
syzbot has tested the proposed patch and the reproducer did not trigger any issue:
Tested on:
commit: 9b0d551b Merge tag 'pull-misc' of git://git.kernel.org.. git tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git console output: https://syzkaller.appspot.com/x/log.txt?x=17a855cd980000 kernel config: https://syzkaller.appspot.com/x/.config?x=50fb29d81ff5a3df dashboard link: https://syzkaller.appspot.com/bug?extid=83c9dd5c0dcf6184fdbf compiler: Debian clang version 20.1.8 (++20250708063551+0c9f909b7976-1~exp1~20250708183702.136), Debian LLD 20.1.8 patch: https://syzkaller.appspot.com/x/patch.diff?x=1609f942580000
Note: testing is done by a robot and is best-effort only.
Quoted 38 lines · Nirbhay Sharma
The call to
kmalloc()to allocate the attribute list buffer is given a size ofal_aligned(rs). This size can be larger than the data subsequently copied into the buffer, leaving trailing bytes uninitialized.This can trigger a KMSAN "uninit-value" warning if that memory is later accessed.
Fix this by using
kzalloc()instead, which ensures the entire allocated buffer is zero-initialized, preventing the warning.Reported-by [email protected]Signed-off-by Nirbhay Sharma <[email protected]>---
The following syzbot test commands were used to verify the fix against both linux-next and a specific mainline commit. Both kernels were configured withCONFIG_KMSAN=y, and no KMSAN warnings were observed with the patch applied.An attempt to test against the latest mainline tip failed due to an unrelated boot failure in the SCSI subsystem (KMSAN: use-after-free in
scsi_get_vpd_buf). Therefore, testing was done on the last known-good mainline commit below.For mainline commit
9b0d551bcc05("Merge tag 'pull-misc' of..."):
#syz test: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git9b0d551bcc05For the linux-next branch:
#syz test: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git masterfs/ntfs3/frecord.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)fs/ntfs3/frecord.c +0
-0
fs/ntfs3/frecord.c int ni_create_attr_list(struct ntfs_inode *ni) · line 773
Quoted 8 lines
fs/ntfs3/frecord.c +1
-1@@ -767,7 +767,7 @@ int ni_create_attr_list(struct ntfs_inode *ni)* Skip estimating exact memory requirement. * Looks like one record_size is always enough. */ - le =kmalloc (al_aligned (rs),GFP_NOFS ); + le =kzalloc (al_aligned (rs),GFP_NOFS );if (!le)return -ENOMEM ;
Hi Konstantin,
I sent this patch about 3 weeks ago and haven't heard back yet. I wanted to check if there are any concerns with the patch or if any changes are needed. The fix addresses a KMSAN uninit-value bug and has been tested successfully on both linux-next and the commit from the syzbot report.
Please let me know if you need any additional information or testing.
Thanks,
Nirbhay
Konstantin Komarov
maintainerQuoted 55 lines · Nirbhay Sharma
Quoted 38 lines · Nirbhay Sharma
The call to
kmalloc()to allocate the attribute list buffer is given a size ofal_aligned(rs). This size can be larger than the data subsequently copied into the buffer, leaving trailing bytes uninitialized.This can trigger a KMSAN "uninit-value" warning if that memory is later accessed.
Fix this by using
kzalloc()instead, which ensures the entire allocated buffer is zero-initialized, preventing the warning.Reported-by [email protected]Signed-off-by Nirbhay Sharma <[email protected]>---
The following syzbot test commands were used to verify the fix against both linux-next and a specific mainline commit. Both kernels were configured withCONFIG_KMSAN=y, and no KMSAN warnings were observed with the patch applied.An attempt to test against the latest mainline tip failed due to an unrelated boot failure in the SCSI subsystem (KMSAN: use-after-free in
scsi_get_vpd_buf). Therefore, testing was done on the last known-good mainline commit below.For mainline commit
9b0d551bcc05("Merge tag 'pull-misc' of..."):
#syz test: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git9b0d551bcc05For the linux-next branch:
#syz test: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
fs/ntfs3/frecord.c| 2 +-1 file changed, 1 insertion(+), 1 deletion(-)fs/ntfs3/frecord.c +0
-0fs/ntfs3/frecord.c int ni_create_attr_list(struct ntfs_inode *ni) · line 772
Quoted 7 lines
fs/ntfs3/frecord.c +1
-1@@ -767,7 +767,7 @@ int ni_create_attr_list(struct ntfs_inode *ni)* Skip estimating exact memory requirement. * Looks like one record_size is always enough. */ - le = kmalloc(al_aligned(rs), GFP_NOFS); + le = kzalloc(al_aligned(rs), GFP_NOFS); if (!le) return -ENOMEM;Hi Konstantin,
I sent this patch about 3 weeks ago and haven't heard back yet. I wanted to check if there are any concerns with the patch or if any changes are needed. The fix addresses a KMSAN uninit-value bug and has been tested successfully on both linux-next and the commit from the syzbot report.
Quoted 4 lines
Please let me know if you need any additional information or testing.
Thanks,
Nirbhay
Hello,
Your patch has been applied, but it hasn’t been pushed to our repository yet. It will be there as soon as possible.
I’ll let you know once it’s merged into kernel. Thanks for your patience.
Regards,
Konstantin