KASAN: stack-out-of-bounds Write in truncate_inode_pages_range

Status: upstream: reported C repro on 2023/06/26 12:33
Bug presence: origin:upstream
Labels: missing-backport
[Documentation on labels]
First crash: 356d, last: 246d
Fix bisection: the issue occurs on the latest tested release (bisect log)
Crash: BUG: unable to handle kernel paging request in writeback_single_inode (log)
Repro: C syz .config
Bug presence (3)
Date Name Commit Repro Result
2023/09/25 linux-6.1.y (ToT) d23900f974e0 C [report] KASAN: stack-out-of-bounds Write in truncate_inode_pages_final
2023/06/26 upstream (ToT) 941d77c77339 C [report] KASAN: stack-out-of-bounds Write in truncate_inode_pages_range
2023/09/25 upstream (ToT) 6465e260f487 C Didn't crash
Similar bugs (1)
Kernel Title Repro Cause bisect Fix bisect Count Last Reported Patched Status
upstream UBSAN: array-index-out-of-bounds in truncate_inode_pages_range ntfs3 C error done 31 356d 655d 0/27 auto-obsoleted due to no activity on 2023/10/04 17:28
Fix bisection attempts (3)
Created Duration User Patch Repo Result
2023/10/16 07:20 2h42m fix candidate upstream job log (0)
2023/10/14 07:01 2h21m bisect fix linux-6.1.y job log (0) log
2023/09/07 05:58 3h01m bisect fix linux-6.1.y job log (0) log

Sample crash report:
ntfs3: loop0: Different NTFS' sector size (1024) and media sector size (512)
BUG: KASAN: stack-out-of-bounds in truncate_inode_pages_range+0xb4/0xf10 mm/truncate.c:335
Write of size 128 at addr ffff800023177520 by task syz-executor290/21125

CPU: 1 PID: 21125 Comm: syz-executor290 Not tainted 6.1.35-syzkaller #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 05/27/2023
Call trace:
 dump_backtrace+0x1c8/0x1f4 arch/arm64/kernel/stacktrace.c:158
 show_stack+0x2c/0x3c arch/arm64/kernel/stacktrace.c:165
 __dump_stack lib/dump_stack.c:88 [inline]
 dump_stack_lvl+0x108/0x170 lib/dump_stack.c:106
 print_address_description mm/kasan/report.c:284 [inline]
 print_report+0x174/0x4c0 mm/kasan/report.c:395
 kasan_report+0xd4/0x130 mm/kasan/report.c:495
 kasan_check_range+0x264/0x2a4 mm/kasan/generic.c:189
 memset+0x40/0x70 mm/kasan/shadow.c:44
 truncate_inode_pages_range+0xb4/0xf10 mm/truncate.c:335
 truncate_inode_pages mm/truncate.c:452 [inline]
 truncate_inode_pages_final+0x90/0xc0 mm/truncate.c:487
 ntfs_evict_inode+0x24/0xc8 fs/ntfs3/inode.c:1760
 evict+0x260/0x68c fs/inode.c:664
 iput_final fs/inode.c:1747 [inline]
 iput+0x7c0/0x8a4 fs/inode.c:1773
 ntfs_fill_super+0x32d8/0x3a04 fs/ntfs3/super.c:1190
 get_tree_bdev+0x360/0x54c fs/super.c:1346
 ntfs_fs_get_tree+0x28/0x38 fs/ntfs3/super.c:1359
 vfs_get_tree+0x90/0x274 fs/super.c:1553
 do_new_mount+0x25c/0x8c4 fs/namespace.c:3040
 path_mount+0x590/0xe58 fs/namespace.c:3370
 do_mount fs/namespace.c:3383 [inline]
 __do_sys_mount fs/namespace.c:3591 [inline]
 __se_sys_mount fs/namespace.c:3568 [inline]
 __arm64_sys_mount+0x45c/0x594 fs/namespace.c:3568
 __invoke_syscall arch/arm64/kernel/syscall.c:38 [inline]
 invoke_syscall+0x98/0x2c0 arch/arm64/kernel/syscall.c:52
 el0_svc_common+0x138/0x258 arch/arm64/kernel/syscall.c:142
 do_el0_svc+0x64/0x218 arch/arm64/kernel/syscall.c:206
 el0_svc+0x58/0x168 arch/arm64/kernel/entry-common.c:637
 el0t_64_sync_handler+0x84/0xf0 arch/arm64/kernel/entry-common.c:655
 el0t_64_sync+0x18c/0x190 arch/arm64/kernel/entry.S:581

The buggy address belongs to stack of task syz-executor290/21125
 and is located at offset 32 in frame:
 folio_flags include/linux/page-flags.h:319 [inline]
 folio_test_head include/linux/page-flags.h:788 [inline]
 folio_test_large include/linux/page-flags.h:809 [inline]
 folio_nr_pages include/linux/mm.h:1670 [inline]
 truncate_inode_pages_range+0x0/0xf10 mm/truncate.c:277

This frame has 2 objects:
 [32, 160) 'fbatch'
 [192, 312) 'indices'

The buggy address belongs to the virtual mapping at
 [ffff800023170000, ffff800023179000) created by:
 copy_process+0x530/0x38d0 kernel/fork.c:2090

The buggy address belongs to the physical page:
page:000000007eeb5a98 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x10360e
flags: 0x5ffc00000000000(node=0|zone=2|lastcpupid=0x7ff)
raw: 05ffc00000000000 0000000000000000 dead000000000122 0000000000000000
raw: 0000000000000000 0000000000000000 00000001ffffffff 0000000000000000
page dumped because: kasan: bad access detected

Memory state around the buggy address:
 ffff800023177400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 ffff800023177480: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
>ffff800023177500: f1 f1 f1 f1 00 00 00 00 00 00 00 00 00 00 00 f3
 ffff800023177580: 00 00 00 00 f2 f2 f2 f2 00 00 00 00 00 00 00 00
 ffff800023177600: 00 00 00 00 00 00 00 f3 f3 f3 f3 f3 00 00 00 00
ntfs3: loop0: Mark volume as dirty due to NTFS errors
ntfs3: loop0: ino=0, ntfs_iget5
ntfs3: loop0: MFT: r=0, expect seq=5 instead of 1!
ntfs3: loop0: ino=1f, "file2" failed to open parent directory r=0 to update

Crashes (1):
Time Kernel Commit Syzkaller Config Log Report Syz repro C repro VM info Assets (help?) Manager Title
2023/06/26 12:32 linux-6.1.y e84a4e368abe 79782afc .config console log report syz C [disk image] [vmlinux] [kernel image] [mounted in repro] ci2-linux-6-1-kasan-arm64 KASAN: stack-out-of-bounds Write in truncate_inode_pages_range
* Struck through repros no longer work on HEAD.