All of lore.kernel.org
 help / color / mirror / Atom feed
* [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2)
@ 2026-03-30  9:56 syzbot
  2026-04-16 10:23 ` syzbot
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: syzbot @ 2026-03-30  9:56 UTC (permalink / raw)
  To: akpm, baolin.wang, hughd, linux-kernel, linux-mm, syzkaller-bugs

Hello,

syzbot found the following issue on:

HEAD commit:    24d479d26b25 Linux 6.19-rc6
git tree:       upstream
console output: https://syzkaller.appspot.com/x/log.txt?x=15454e3a580000
kernel config:  https://syzkaller.appspot.com/x/.config?x=c33bf4a3a0c7a4f1
dashboard link: https://syzkaller.appspot.com/bug?extid=6cc93ec9a4035badb85f
compiler:       Debian clang version 21.1.8 (++20251221033036+2078da43e25a-1~exp1~20251221153213.50), Debian LLD 21.1.8

Unfortunately, I don't have any reproducer for this issue yet.

Downloadable assets:
disk image: https://storage.googleapis.com/syzbot-assets/f0555f920605/disk-24d479d2.raw.xz
vmlinux: https://storage.googleapis.com/syzbot-assets/ae277d28fcd2/vmlinux-24d479d2.xz
kernel image: https://storage.googleapis.com/syzbot-assets/b4f8db4a51a6/bzImage-24d479d2.xz

IMPORTANT: if you fix the issue, please add the following tag to the commit:
Reported-by: syzbot+6cc93ec9a4035badb85f@syzkaller.appspotmail.com

==================================================================
BUG: KASAN: use-after-free in memcpy_from_iter lib/iov_iter.c:85 [inline]
BUG: KASAN: use-after-free in iterate_bvec include/linux/iov_iter.h:123 [inline]
BUG: KASAN: use-after-free in iterate_and_advance2 include/linux/iov_iter.h:306 [inline]
BUG: KASAN: use-after-free in iterate_and_advance include/linux/iov_iter.h:330 [inline]
BUG: KASAN: use-after-free in __copy_from_iter lib/iov_iter.c:261 [inline]
BUG: KASAN: use-after-free in copy_folio_from_iter_atomic+0xa6c/0x1950 lib/iov_iter.c:491
Read of size 4096 at addr ffff88803177d000 by task kworker/u8:9/1219

CPU: 0 UID: 0 PID: 1219 Comm: kworker/u8:9 Not tainted syzkaller #0 PREEMPT_{RT,(full)} 
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 10/25/2025
Workqueue: loop1 loop_workfn
Call Trace:
 <TASK>
 dump_stack_lvl+0xe8/0x150 lib/dump_stack.c:120
 print_address_description mm/kasan/report.c:378 [inline]
 print_report+0xba/0x230 mm/kasan/report.c:482
 kasan_report+0x117/0x150 mm/kasan/report.c:595
 check_region_inline mm/kasan/generic.c:-1 [inline]
 kasan_check_range+0x264/0x2c0 mm/kasan/generic.c:200
 __asan_memcpy+0x29/0x70 mm/kasan/shadow.c:105
 memcpy_from_iter lib/iov_iter.c:85 [inline]
 iterate_bvec include/linux/iov_iter.h:123 [inline]
 iterate_and_advance2 include/linux/iov_iter.h:306 [inline]
 iterate_and_advance include/linux/iov_iter.h:330 [inline]
 __copy_from_iter lib/iov_iter.c:261 [inline]
 copy_folio_from_iter_atomic+0xa6c/0x1950 lib/iov_iter.c:491
 generic_perform_write+0x5b1/0x8b0 mm/filemap.c:4332
 shmem_file_write_iter+0xfb/0x120 mm/shmem.c:3490
 lo_rw_aio+0xc80/0xf00 include/linux/percpu-rwsem.h:-1
 do_req_filebacked drivers/block/loop.c:434 [inline]
 loop_handle_cmd drivers/block/loop.c:1947 [inline]
 loop_process_work+0x637/0x11b0 drivers/block/loop.c:1982
 process_one_work kernel/workqueue.c:3257 [inline]
 process_scheduled_works+0xaec/0x17a0 kernel/workqueue.c:3340
 worker_thread+0x89f/0xd90 kernel/workqueue.c:3421
 kthread+0x726/0x8b0 kernel/kthread.c:463
 ret_from_fork+0x51b/0xa40 arch/x86/kernel/process.c:158
 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:246
 </TASK>

The buggy address belongs to the physical page:
page: refcount:0 mapcount:0 mapping:0000000000000000 index:0xffff88803177d000 pfn:0x3177d
flags: 0x80000000000000(node=0|zone=1)
raw: 0080000000000000 ffffea00016beb08 ffffea00009e42c8 0000000000000000
raw: ffff88803177d000 0000000000000000 00000000ffffffff 0000000000000000
page dumped because: kasan: bad access detected
page_owner tracks the page as freed
page last allocated via order 0, migratetype Unmovable, gfp_mask 0xdc0(GFP_KERNEL|__GFP_ZERO), pid 6876, tgid 6875 (syz.1.137), ts 163020649815, free_ts 163886382057
 set_page_owner include/linux/page_owner.h:32 [inline]
 post_alloc_hook+0x228/0x280 mm/page_alloc.c:1884
 prep_new_page mm/page_alloc.c:1892 [inline]
 get_page_from_freelist+0x28bb/0x2950 mm/page_alloc.c:3945
 __alloc_frozen_pages_noprof+0x18d/0x380 mm/page_alloc.c:5240
 alloc_pages_mpol+0xd1/0x380 mm/mempolicy.c:2486
 alloc_frozen_pages_noprof mm/mempolicy.c:2557 [inline]
 alloc_pages_noprof+0xce/0x1e0 mm/mempolicy.c:2577
 lbmLogInit fs/jfs/jfs_logmgr.c:1815 [inline]
 lmLogInit+0x357/0x1a00 fs/jfs/jfs_logmgr.c:1269
 open_inline_log fs/jfs/jfs_logmgr.c:1175 [inline]
 lmLogOpen+0x4e1/0xfa0 fs/jfs/jfs_logmgr.c:1069
 jfs_mount_rw+0xee/0x670 fs/jfs/jfs_mount.c:257
 jfs_fill_super+0x754/0xd80 fs/jfs/super.c:532
 get_tree_bdev_flags+0x431/0x4f0 fs/super.c:1691
 vfs_get_tree+0x92/0x2a0 fs/super.c:1751
 fc_mount fs/namespace.c:1199 [inline]
 do_new_mount_fc fs/namespace.c:3636 [inline]
 do_new_mount+0x329/0xa50 fs/namespace.c:3712
 do_mount fs/namespace.c:4035 [inline]
 __do_sys_mount fs/namespace.c:4224 [inline]
 __se_sys_mount+0x31d/0x420 fs/namespace.c:4201
 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline]
 do_syscall_64+0xe2/0xf80 arch/x86/entry/syscall_64.c:94
 entry_SYSCALL_64_after_hwframe+0x77/0x7f
page last free pid 5804 tgid 5804 stack trace:
 reset_page_owner include/linux/page_owner.h:25 [inline]
 free_pages_prepare mm/page_alloc.c:1433 [inline]
 __free_frozen_pages+0xfc1/0x1130 mm/page_alloc.c:2973
 lbmLogShutdown fs/jfs/jfs_logmgr.c:1863 [inline]
 lmLogShutdown+0x44e/0x850 fs/jfs/jfs_logmgr.c:1683
 lmLogClose+0x28a/0x520 fs/jfs/jfs_logmgr.c:1459
 jfs_umount+0x2ef/0x3c0 fs/jfs/jfs_umount.c:114
 jfs_put_super+0x8c/0x190 fs/jfs/super.c:194
 generic_shutdown_super+0x135/0x2c0 fs/super.c:643
 kill_block_super+0x44/0x90 fs/super.c:1722
 deactivate_locked_super+0xbc/0x130 fs/super.c:474
 cleanup_mnt+0x437/0x4d0 fs/namespace.c:1318
 task_work_run+0x1d9/0x270 kernel/task_work.c:233
 resume_user_mode_work include/linux/resume_user_mode.h:50 [inline]
 __exit_to_user_mode_loop kernel/entry/common.c:44 [inline]
 exit_to_user_mode_loop+0xed/0x480 kernel/entry/common.c:75
 __exit_to_user_mode_prepare include/linux/irq-entry-common.h:226 [inline]
 syscall_exit_to_user_mode_prepare include/linux/irq-entry-common.h:256 [inline]
 syscall_exit_to_user_mode_work include/linux/entry-common.h:159 [inline]
 syscall_exit_to_user_mode include/linux/entry-common.h:194 [inline]
 do_syscall_64+0x2b7/0xf80 arch/x86/entry/syscall_64.c:100
 entry_SYSCALL_64_after_hwframe+0x77/0x7f

Memory state around the buggy address:
 ffff88803177cf00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
 ffff88803177cf80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
>ffff88803177d000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
                   ^
 ffff88803177d080: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
 ffff88803177d100: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
==================================================================


---
This report is generated by a bot. It may contain errors.
See https://goo.gl/tpsmEJ for more information about syzbot.
syzbot engineers can be reached at syzkaller@googlegroups.com.

syzbot will keep track of this issue. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot.

If the report is already addressed, let syzbot know by replying with:
#syz fix: exact-commit-title

If you want to overwrite report's subsystems, reply with:
#syz set subsystems: new-subsystem
(See the list of subsystem names on the web dashboard)

If the report is a duplicate of another one, reply with:
#syz dup: exact-subject-of-another-report

If you want to undo deduplication, reply with:
#syz undup


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2)
  2026-03-30  9:56 [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2) syzbot
@ 2026-04-16 10:23 ` syzbot
  2026-04-17 20:43 ` Forwarded: " syzbot
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: syzbot @ 2026-04-16 10:23 UTC (permalink / raw)
  To: akpm, baolin.wang, hughd, linux-kernel, linux-mm, syzkaller-bugs,
	tahernady45

syzbot has found a reproducer for the following issue on:

HEAD commit:    e6efabc0afca Add linux-next specific files for 20260414
git tree:       linux-next
console output: https://syzkaller.appspot.com/x/log.txt?x=17908702580000
kernel config:  https://syzkaller.appspot.com/x/.config?x=56c2b36de3316f1b
dashboard link: https://syzkaller.appspot.com/bug?extid=6cc93ec9a4035badb85f
compiler:       Debian clang version 21.1.8 (++20251221033036+2078da43e25a-1~exp1~20251221153213.50), Debian LLD 21.1.8
syz repro:      https://syzkaller.appspot.com/x/repro.syz?x=14c798ce580000
C reproducer:   https://syzkaller.appspot.com/x/repro.c?x=1142c4ce580000

Downloadable assets:
disk image: https://storage.googleapis.com/syzbot-assets/e7099cbf73e4/disk-e6efabc0.raw.xz
vmlinux: https://storage.googleapis.com/syzbot-assets/439c402df1b9/vmlinux-e6efabc0.xz
kernel image: https://storage.googleapis.com/syzbot-assets/fc0c0175fc76/bzImage-e6efabc0.xz
mounted in repro: https://storage.googleapis.com/syzbot-assets/94fa7bad6be9/mount_0.gz
  fsck result: failed (log: https://syzkaller.appspot.com/x/fsck.log?x=17017b16580000)

IMPORTANT: if you fix the issue, please add the following tag to the commit:
Reported-by: syzbot+6cc93ec9a4035badb85f@syzkaller.appspotmail.com

==================================================================
BUG: KASAN: use-after-free in memcpy_from_iter lib/iov_iter.c:85 [inline]
BUG: KASAN: use-after-free in iterate_bvec include/linux/iov_iter.h:123 [inline]
BUG: KASAN: use-after-free in iterate_and_advance2 include/linux/iov_iter.h:306 [inline]
BUG: KASAN: use-after-free in iterate_and_advance include/linux/iov_iter.h:330 [inline]
BUG: KASAN: use-after-free in __copy_from_iter lib/iov_iter.c:261 [inline]
BUG: KASAN: use-after-free in copy_folio_from_iter_atomic+0xbb5/0x1ad0 lib/iov_iter.c:491
Read of size 4096 at addr ffff888037cb3000 by task kworker/u8:7/1020

CPU: 0 UID: 0 PID: 1020 Comm: kworker/u8:7 Not tainted syzkaller #0 PREEMPT_{RT,(full)} 
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 03/18/2026
Workqueue: loop0 loop_workfn
Call Trace:
 <TASK>
 dump_stack_lvl+0xe8/0x150 lib/dump_stack.c:120
 print_address_description+0x55/0x1e0 mm/kasan/report.c:378
 print_report+0x58/0x70 mm/kasan/report.c:482
 kasan_report+0x117/0x150 mm/kasan/report.c:595
 check_region_inline mm/kasan/generic.c:-1 [inline]
 kasan_check_range+0x264/0x2c0 mm/kasan/generic.c:200
 __asan_memcpy+0x29/0x70 mm/kasan/shadow.c:105
 memcpy_from_iter lib/iov_iter.c:85 [inline]
 iterate_bvec include/linux/iov_iter.h:123 [inline]
 iterate_and_advance2 include/linux/iov_iter.h:306 [inline]
 iterate_and_advance include/linux/iov_iter.h:330 [inline]
 __copy_from_iter lib/iov_iter.c:261 [inline]
 copy_folio_from_iter_atomic+0xbb5/0x1ad0 lib/iov_iter.c:491
 generic_perform_write+0x5b1/0x8b0 mm/filemap.c:4342
 shmem_file_write_iter+0xfb/0x120 mm/shmem.c:3478
 lo_rw_aio+0xc80/0xf00 include/linux/percpu-rwsem.h:-1
 do_req_filebacked drivers/block/loop.c:433 [inline]
 loop_handle_cmd drivers/block/loop.c:1925 [inline]
 loop_process_work+0x637/0x11b0 drivers/block/loop.c:1960
 process_one_work kernel/workqueue.c:3308 [inline]
 process_scheduled_works+0xb68/0x1910 kernel/workqueue.c:3399
 worker_thread+0xa90/0x1040 kernel/workqueue.c:3485
 kthread+0x388/0x470 kernel/kthread.c:436
 ret_from_fork+0x514/0xb70 arch/x86/kernel/process.c:158
 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:245
 </TASK>

The buggy address belongs to the physical page:
page: refcount:0 mapcount:0 mapping:0000000000000000 index:0x38 pfn:0x37cb3
flags: 0x80000000000000(node=0|zone=1)
raw: 0080000000000000 ffffea0000d17548 ffffea0001353448 0000000000000000
raw: 0000000000000038 0000000000000000 00000000ffffffff 0000000000000000
page dumped because: kasan: bad access detected
page_owner tracks the page as freed
page last allocated via order 0, migratetype Unmovable, gfp_mask 0xdc0(GFP_KERNEL|__GFP_ZERO), pid 6098, tgid 6098 (syz.0.91), ts 154383709391, free_ts 154428922615
 set_page_owner include/linux/page_owner.h:32 [inline]
 post_alloc_hook+0x231/0x280 mm/page_alloc.c:1858
 prep_new_page mm/page_alloc.c:1866 [inline]
 get_page_from_freelist+0x27d6/0x2850 mm/page_alloc.c:3946
 __alloc_frozen_pages_noprof+0x18d/0x380 mm/page_alloc.c:5226
 alloc_pages_mpol+0xd1/0x380 mm/mempolicy.c:2490
 alloc_frozen_pages_noprof mm/mempolicy.c:2561 [inline]
 alloc_pages_noprof+0xd2/0x2f0 mm/mempolicy.c:2581
 lbmLogInit fs/jfs/jfs_logmgr.c:1813 [inline]
 lmLogInit+0x357/0x1a00 fs/jfs/jfs_logmgr.c:1267
 open_inline_log fs/jfs/jfs_logmgr.c:1173 [inline]
 lmLogOpen+0x4e1/0xfa0 fs/jfs/jfs_logmgr.c:1067
 jfs_mount_rw+0xee/0x670 fs/jfs/jfs_mount.c:257
 jfs_fill_super+0x754/0xd80 fs/jfs/super.c:532
 get_tree_bdev_flags+0x431/0x4f0 fs/super.c:1694
 vfs_get_tree+0x92/0x2a0 fs/super.c:1754
 fc_mount fs/namespace.c:1193 [inline]
 do_new_mount_fc fs/namespace.c:3758 [inline]
 do_new_mount+0x341/0xd30 fs/namespace.c:3834
 do_mount fs/namespace.c:4167 [inline]
 __do_sys_mount fs/namespace.c:4399 [inline]
 __se_sys_mount+0x31d/0x420 fs/namespace.c:4376
 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline]
 do_syscall_64+0x15f/0xf80 arch/x86/entry/syscall_64.c:94
 entry_SYSCALL_64_after_hwframe+0x77/0x7f
page last free pid 5945 tgid 5945 stack trace:
 reset_page_owner include/linux/page_owner.h:25 [inline]
 __free_pages_prepare mm/page_alloc.c:1402 [inline]
 __free_frozen_pages+0xf9b/0x10f0 mm/page_alloc.c:2943
 lbmLogShutdown fs/jfs/jfs_logmgr.c:1861 [inline]
 lmLogShutdown+0x44e/0x850 fs/jfs/jfs_logmgr.c:1681
 lmLogClose+0x28a/0x520 fs/jfs/jfs_logmgr.c:1457
 jfs_umount+0x2fb/0x3d0 fs/jfs/jfs_umount.c:124
 jfs_put_super+0x8c/0x190 fs/jfs/super.c:194
 generic_shutdown_super+0x13d/0x2d0 fs/super.c:646
 kill_block_super+0x44/0x90 fs/super.c:1725
 deactivate_locked_super+0xbc/0x130 fs/super.c:476
 cleanup_mnt+0x437/0x4d0 fs/namespace.c:1312
 task_work_run+0x1d9/0x270 kernel/task_work.c:233
 resume_user_mode_work include/linux/resume_user_mode.h:50 [inline]
 __exit_to_user_mode_loop kernel/entry/common.c:67 [inline]
 exit_to_user_mode_loop+0xed/0x480 kernel/entry/common.c:98
 __exit_to_user_mode_prepare include/linux/irq-entry-common.h:207 [inline]
 syscall_exit_to_user_mode_prepare include/linux/irq-entry-common.h:238 [inline]
 syscall_exit_to_user_mode include/linux/entry-common.h:328 [inline]
 do_syscall_64+0x33e/0xf80 arch/x86/entry/syscall_64.c:100
 entry_SYSCALL_64_after_hwframe+0x77/0x7f

Memory state around the buggy address:
 ffff888037cb2f00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
 ffff888037cb2f80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
>ffff888037cb3000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
                   ^
 ffff888037cb3080: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
 ffff888037cb3100: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
==================================================================


---
If you want syzbot to run the reproducer, reply with:
#syz test: git://repo/address.git branch-or-commit-hash
If you attach or paste a git patch, syzbot will apply it before testing.


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Forwarded: Re: [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2)
  2026-03-30  9:56 [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2) syzbot
  2026-04-16 10:23 ` syzbot
@ 2026-04-17 20:43 ` syzbot
  2026-04-20  4:08 ` syzbot
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: syzbot @ 2026-04-17 20:43 UTC (permalink / raw)
  To: linux-kernel, syzkaller-bugs

For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.

***

Subject: Re: [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2)
Author: suresh.k.chandrappa@gmail.com

#syz test: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
master

diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c
index 306165e61438..e8ae90be089b 100644
--- a/fs/jfs/jfs_logmgr.c
+++ b/fs/jfs/jfs_logmgr.c
@@ -1804,6 +1804,7 @@ static int lbmLogInit(struct jfs_log * log)
     * avoid deadlock here.
     */
    init_waitqueue_head(&log->free_wait);
+   init_waitqueue_head(&log->io_waitq);

    log->lbuf_free = NULL;

@@ -1855,6 +1856,8 @@ static void lbmLogShutdown(struct jfs_log * log)

    jfs_info("lbmLogShutdown: log:0x%p", log);

+   wait_event(log->io_waitq, !atomic_read(&log->io_inflight));
+
    lbuf = log->lbuf_free;
    while (lbuf) {
        struct lbuf *next = lbuf->l_freelist;
@@ -1976,6 +1979,8 @@ static int lbmRead(struct jfs_log * log, int pn,
struct lbuf ** bpp)

    bio->bi_end_io = lbmIODone;
    bio->bi_private = bp;
+
+   atomic_inc(&log->io_inflight);
    /*check if journaling to disk has been disabled*/
    if (log->no_integrity) {
        bio->bi_iter.bi_size = 0;
@@ -2123,6 +2128,7 @@ static void lbmStartIO(struct lbuf * bp)
    bio->bi_end_io = lbmIODone;
    bio->bi_private = bp;

+   atomic_inc(&log->io_inflight);
    /* check if journaling to disk has been disabled */
    if (log->no_integrity) {
        bio->bi_iter.bi_size = 0;
@@ -2186,6 +2192,8 @@ static void lbmIODone(struct bio *bio)

    bio_put(bio);

+   log = bp->l_log;
+
    /*
     *  pagein completion
     */
@@ -2214,7 +2222,6 @@ static void lbmIODone(struct bio *bio)
    INCREMENT(lmStat.pagedone);

    /* update committed lsn */
-   log = bp->l_log;
    log->clsn = (bp->l_pn << L2LOGPSIZE) + bp->l_ceor;

    if (bp->l_flag & lbmDIRECT) {
@@ -2299,6 +2306,9 @@ static void lbmIODone(struct bio *bio)
 out:
    bp->l_flag |= lbmDONE;
    LCACHE_UNLOCK(flags);
+
+   if (atomic_dec_and_test(&log->io_inflight))
+       wake_up(&log->io_waitq);
 }

 int jfsIOWait(void *arg)
diff --git a/fs/jfs/jfs_logmgr.h b/fs/jfs/jfs_logmgr.h
index 09e0ef6aecce..d8858448de6f 100644
--- a/fs/jfs/jfs_logmgr.h
+++ b/fs/jfs/jfs_logmgr.h
@@ -400,6 +400,9 @@ struct jfs_log {
    uuid_t uuid;        /* 16: 128-bit uuid of log device */

    int no_integrity;   /* 3: flag to disable journaling to disk */
+
+   atomic_t io_inflight;
+   wait_queue_head_t io_waitq;
 };

 /*
--
2.43.0

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Forwarded: Re: [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2)
  2026-03-30  9:56 [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2) syzbot
  2026-04-16 10:23 ` syzbot
  2026-04-17 20:43 ` Forwarded: " syzbot
@ 2026-04-20  4:08 ` syzbot
  2026-04-20  4:11 ` syzbot
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: syzbot @ 2026-04-20  4:08 UTC (permalink / raw)
  To: linux-kernel, syzkaller-bugs

For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.

***

Subject: Re: [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2)
Author: suresh.k.chandrappa@gmail.com

#syz test: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
master

From 56a838ee6e3c6834a7e7705472144b1c84a4d8f8 Mon Sep 17 00:00:00 2001
From: Suresh K C <suresh.k.chandrappa@gmail.com>
Date: Sat, 18 Apr 2026 10:14:20 +0530
Subject: [PATCH] jfs: fix use-after-free in lbmIODone

Add an atomic io_inflight counter and a wait queue (io_waitq) to
struct jfs_log to track in-flight I/O operations. This ensures that
lbmLogShutdown() waits for all pending log I/O to complete before
freeing log buffers, preventing a use-after-free race condition where
the loop device workqueue could still be reading from log buffer pages
that have already been freed.

The io_inflight counter is incremented in lbmRead() and lbmStartIO()
before submitting bios, and decremented in lbmIODone() after I/O
completion processing is finished.

Reported-by: syzbot+6cc93ec9a4035badb85f@syzkaller.appspotmail.com
Signed-off-by: Suresh K C <suresh.k.chandrappa@gmail.com>
---
 fs/jfs/jfs_logmgr.c | 12 +++++++++++-
 fs/jfs/jfs_logmgr.h |  3 +++
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c
index 306165e61438..e8ae90be089b 100644
--- a/fs/jfs/jfs_logmgr.c
+++ b/fs/jfs/jfs_logmgr.c
@@ -1804,6 +1804,7 @@ static int lbmLogInit(struct jfs_log * log)
      * avoid deadlock here.
      */
     init_waitqueue_head(&log->free_wait);
+    init_waitqueue_head(&log->io_waitq);

     log->lbuf_free = NULL;

@@ -1855,6 +1856,8 @@ static void lbmLogShutdown(struct jfs_log * log)

     jfs_info("lbmLogShutdown: log:0x%p", log);

+    wait_event(log->io_waitq, !atomic_read(&log->io_inflight));
+
     lbuf = log->lbuf_free;
     while (lbuf) {
         struct lbuf *next = lbuf->l_freelist;
@@ -1976,6 +1979,8 @@ static int lbmRead(struct jfs_log * log, int pn,
struct lbuf ** bpp)

     bio->bi_end_io = lbmIODone;
     bio->bi_private = bp;
+
+    atomic_inc(&log->io_inflight);
     /*check if journaling to disk has been disabled*/
     if (log->no_integrity) {
         bio->bi_iter.bi_size = 0;
@@ -2123,6 +2128,7 @@ static void lbmStartIO(struct lbuf * bp)
     bio->bi_end_io = lbmIODone;
     bio->bi_private = bp;

+    atomic_inc(&log->io_inflight);
     /* check if journaling to disk has been disabled */
     if (log->no_integrity) {
         bio->bi_iter.bi_size = 0;
@@ -2186,6 +2192,8 @@ static void lbmIODone(struct bio *bio)

     bio_put(bio);

+    log = bp->l_log;
+
     /*
      *    pagein completion
      */
@@ -2214,7 +2222,6 @@ static void lbmIODone(struct bio *bio)
     INCREMENT(lmStat.pagedone);

     /* update committed lsn */
-    log = bp->l_log;
     log->clsn = (bp->l_pn << L2LOGPSIZE) + bp->l_ceor;

     if (bp->l_flag & lbmDIRECT) {
@@ -2299,6 +2306,9 @@ static void lbmIODone(struct bio *bio)
 out:
     bp->l_flag |= lbmDONE;
     LCACHE_UNLOCK(flags);
+
+    if (atomic_dec_and_test(&log->io_inflight))
+        wake_up(&log->io_waitq);
 }

 int jfsIOWait(void *arg)
diff --git a/fs/jfs/jfs_logmgr.h b/fs/jfs/jfs_logmgr.h
index 09e0ef6aecce..d8858448de6f 100644
--- a/fs/jfs/jfs_logmgr.h
+++ b/fs/jfs/jfs_logmgr.h
@@ -400,6 +400,9 @@ struct jfs_log {
     uuid_t uuid;        /* 16: 128-bit uuid of log device */

     int no_integrity;    /* 3: flag to disable journaling to disk */
+
+    atomic_t io_inflight;
+    wait_queue_head_t io_waitq;
 };

 /*
-- 
2.43.0

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Forwarded: Re: [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2)
  2026-03-30  9:56 [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2) syzbot
                   ` (2 preceding siblings ...)
  2026-04-20  4:08 ` syzbot
@ 2026-04-20  4:11 ` syzbot
  2026-04-23 13:26 ` Forwarded: [PATCH 1/1] jfs: try syzbot fix syzbot
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: syzbot @ 2026-04-20  4:11 UTC (permalink / raw)
  To: linux-kernel, syzkaller-bugs

For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.

***

Subject: Re: [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2)
Author: suresh.k.chandrappa@gmail.com

#syz test: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
master

diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c
index 306165e61438..e8ae90be089b 100644
--- a/fs/jfs/jfs_logmgr.c
+++ b/fs/jfs/jfs_logmgr.c
@@ -1804,6 +1804,7 @@ static int lbmLogInit(struct jfs_log * log)
      * avoid deadlock here.
      */
     init_waitqueue_head(&log->free_wait);
+    init_waitqueue_head(&log->io_waitq);

     log->lbuf_free = NULL;

@@ -1855,6 +1856,8 @@ static void lbmLogShutdown(struct jfs_log * log)

     jfs_info("lbmLogShutdown: log:0x%p", log);

+    wait_event(log->io_waitq, !atomic_read(&log->io_inflight));
+
     lbuf = log->lbuf_free;
     while (lbuf) {
         struct lbuf *next = lbuf->l_freelist;
@@ -1976,6 +1979,8 @@ static int lbmRead(struct jfs_log * log, int pn,
struct lbuf ** bpp)

     bio->bi_end_io = lbmIODone;
     bio->bi_private = bp;
+
+    atomic_inc(&log->io_inflight);
     /*check if journaling to disk has been disabled*/
     if (log->no_integrity) {
         bio->bi_iter.bi_size = 0;
@@ -2123,6 +2128,7 @@ static void lbmStartIO(struct lbuf * bp)
     bio->bi_end_io = lbmIODone;
     bio->bi_private = bp;

+    atomic_inc(&log->io_inflight);
     /* check if journaling to disk has been disabled */
     if (log->no_integrity) {
         bio->bi_iter.bi_size = 0;
@@ -2186,6 +2192,8 @@ static void lbmIODone(struct bio *bio)

     bio_put(bio);

+    log = bp->l_log;
+
     /*
      *    pagein completion
      */
@@ -2214,7 +2222,6 @@ static void lbmIODone(struct bio *bio)
     INCREMENT(lmStat.pagedone);

     /* update committed lsn */
-    log = bp->l_log;
     log->clsn = (bp->l_pn << L2LOGPSIZE) + bp->l_ceor;

     if (bp->l_flag & lbmDIRECT) {
@@ -2299,6 +2306,9 @@ static void lbmIODone(struct bio *bio)
 out:
     bp->l_flag |= lbmDONE;
     LCACHE_UNLOCK(flags);
+
+    if (atomic_dec_and_test(&log->io_inflight))
+        wake_up(&log->io_waitq);
 }

 int jfsIOWait(void *arg)
diff --git a/fs/jfs/jfs_logmgr.h b/fs/jfs/jfs_logmgr.h
index 09e0ef6aecce..d8858448de6f 100644
--- a/fs/jfs/jfs_logmgr.h
+++ b/fs/jfs/jfs_logmgr.h
@@ -400,6 +400,9 @@ struct jfs_log {
     uuid_t uuid;        /* 16: 128-bit uuid of log device */

     int no_integrity;    /* 3: flag to disable journaling to disk */
+
+    atomic_t io_inflight;
+    wait_queue_head_t io_waitq;
 };

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Forwarded: [PATCH 1/1] jfs: try syzbot fix
  2026-03-30  9:56 [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2) syzbot
                   ` (3 preceding siblings ...)
  2026-04-20  4:11 ` syzbot
@ 2026-04-23 13:26 ` syzbot
  2026-04-24 21:16 ` Forwarded: Re: [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2) syzbot
  2026-04-25 11:24 ` Forwarded: [PATCH] jfs: fix use-after-free on log shutdown syzbot
  6 siblings, 0 replies; 8+ messages in thread
From: syzbot @ 2026-04-23 13:26 UTC (permalink / raw)
  To: linux-kernel, syzkaller-bugs

For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.

***

Subject: [PATCH 1/1] jfs: try syzbot fix
Author: jakovnovak30@gmail.com

#syz test

---
 fs/jfs/jfs_logmgr.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c
index 306165e61438..b319a4f542d8 100644
--- a/fs/jfs/jfs_logmgr.c
+++ b/fs/jfs/jfs_logmgr.c
@@ -1855,6 +1855,8 @@ static void lbmLogShutdown(struct jfs_log * log)
 
 	jfs_info("lbmLogShutdown: log:0x%p", log);
 
+	LOG_LOCK(log);
+
 	lbuf = log->lbuf_free;
 	while (lbuf) {
 		struct lbuf *next = lbuf->l_freelist;
@@ -1862,6 +1864,8 @@ static void lbmLogShutdown(struct jfs_log * log)
 		kfree(lbuf);
 		lbuf = next;
 	}
+
+	LOG_UNLOCK(log);
 }
 
 
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Forwarded: Re: [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2)
  2026-03-30  9:56 [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2) syzbot
                   ` (4 preceding siblings ...)
  2026-04-23 13:26 ` Forwarded: [PATCH 1/1] jfs: try syzbot fix syzbot
@ 2026-04-24 21:16 ` syzbot
  2026-04-25 11:24 ` Forwarded: [PATCH] jfs: fix use-after-free on log shutdown syzbot
  6 siblings, 0 replies; 8+ messages in thread
From: syzbot @ 2026-04-24 21:16 UTC (permalink / raw)
  To: linux-kernel, syzkaller-bugs

For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.

***

Subject: Re: [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2)
Author: mashiro.chen@mailbox.org

#syz test: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master

From 14bc67ec17b9a209d97c08e9136eead0bd0c0914 Mon Sep 17 00:00:00 2001
From: Mashiro Chen <mashiro.chen@mailbox.org>
Date: Sat, 25 Apr 2026 01:56:00 +0800
Subject: [PATCH] jfs: fix use-after-free on log shutdown

During JFS log shutdown, log buffer pages can be freed while lower-layer
loop workers are still copying from them, triggering a use-after-free
reported by syzbot in copy_folio_from_iter_atomic().

Track in-flight log I/O in struct jfs_log and wait for completion before
freeing log buffers. Add io_inflight/io_waitq, increment io_inflight
before submitting BIOs in lbmRead() and lbmStartIO(), and decrement it
from lbmIODone() on all completion paths, including READ and DIRECT
early-return paths.

This closes the teardown race between buffer page free and late I/O
completion.

Reported-by: syzbot+6cc93ec9a4035badb85f@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=6cc93ec9a4035badb85f
Signed-off-by: Mashiro Chen <mashiro.chen@mailbox.org>
---
 fs/jfs/jfs_logmgr.c | 17 +++++++++++++++--
 fs/jfs/jfs_logmgr.h |  2 ++
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c
index ada00d5bc214..a45c8e2559e4 100644
--- a/fs/jfs/jfs_logmgr.c
+++ b/fs/jfs/jfs_logmgr.c
@@ -1806,6 +1806,8 @@ static int lbmLogInit(struct jfs_log * log)
 	 * avoid deadlock here.
 	 */
 	init_waitqueue_head(&log->free_wait);
+	init_waitqueue_head(&log->io_waitq);
+	atomic_set(&log->io_inflight, 0);
 
 	log->lbuf_free = NULL;
 
@@ -1857,6 +1859,8 @@ static void lbmLogShutdown(struct jfs_log * log)
 
 	jfs_info("lbmLogShutdown: log:0x%p", log);
 
+	wait_event(log->io_waitq, !atomic_read(&log->io_inflight));
+
 	lbuf = log->lbuf_free;
 	while (lbuf) {
 		struct lbuf *next = lbuf->l_freelist;
@@ -1978,6 +1982,7 @@ static int lbmRead(struct jfs_log * log, int pn, struct lbuf ** bpp)
 
 	bio->bi_end_io = lbmIODone;
 	bio->bi_private = bp;
+	atomic_inc(&log->io_inflight);
 	/*check if journaling to disk has been disabled*/
 	if (log->no_integrity) {
 		bio->bi_iter.bi_size = 0;
@@ -2124,6 +2129,7 @@ static void lbmStartIO(struct lbuf * bp)
 
 	bio->bi_end_io = lbmIODone;
 	bio->bi_private = bp;
+	atomic_inc(&log->io_inflight);
 
 	/* check if journaling to disk has been disabled */
 	if (log->no_integrity) {
@@ -2170,7 +2176,7 @@ static void lbmIODone(struct bio *bio)
 {
 	struct lbuf *bp = bio->bi_private;
 	struct lbuf *nextbp, *tail;
-	struct jfs_log *log;
+	struct jfs_log *log = bp->l_log;
 	unsigned long flags;
 
 	/*
@@ -2201,6 +2207,9 @@ static void lbmIODone(struct bio *bio)
 		/* wakeup I/O initiator */
 		LCACHE_WAKEUP(&bp->l_ioevent);
 
+		if (atomic_dec_and_test(&log->io_inflight))
+			wake_up(&log->io_waitq);
+
 		return;
 	}
 
@@ -2220,12 +2229,13 @@ static void lbmIODone(struct bio *bio)
 	INCREMENT(lmStat.pagedone);
 
 	/* update committed lsn */
-	log = bp->l_log;
 	log->clsn = (bp->l_pn << L2LOGPSIZE) + bp->l_ceor;
 
 	if (bp->l_flag & lbmDIRECT) {
 		LCACHE_WAKEUP(&bp->l_ioevent);
 		LCACHE_UNLOCK(flags);
+		if (atomic_dec_and_test(&log->io_inflight))
+			wake_up(&log->io_waitq);
 		return;
 	}
 
@@ -2305,6 +2315,9 @@ static void lbmIODone(struct bio *bio)
 
 		LCACHE_UNLOCK(flags);	/* unlock+enable */
 	}
+
+	if (atomic_dec_and_test(&log->io_inflight))
+		wake_up(&log->io_waitq);
 }
 
 int jfsIOWait(void *arg)
diff --git a/fs/jfs/jfs_logmgr.h b/fs/jfs/jfs_logmgr.h
index 8b8994e48cd0..59cb0aca99c5 100644
--- a/fs/jfs/jfs_logmgr.h
+++ b/fs/jfs/jfs_logmgr.h
@@ -400,6 +400,8 @@ struct jfs_log {
 	uuid_t uuid;		/* 16: 128-bit uuid of log device */
 
 	int no_integrity;	/* 3: flag to disable journaling to disk */
+	atomic_t io_inflight;
+	wait_queue_head_t io_waitq;
 };
 
 /*
-- 
2.54.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Forwarded: [PATCH] jfs: fix use-after-free on log shutdown
  2026-03-30  9:56 [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2) syzbot
                   ` (5 preceding siblings ...)
  2026-04-24 21:16 ` Forwarded: Re: [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2) syzbot
@ 2026-04-25 11:24 ` syzbot
  6 siblings, 0 replies; 8+ messages in thread
From: syzbot @ 2026-04-25 11:24 UTC (permalink / raw)
  To: linux-kernel, syzkaller-bugs

For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.

***

Subject: [PATCH] jfs: fix use-after-free on log shutdown
Author: mashiro.chen@mailbox.org

During JFS log shutdown, log buffer pages can be freed while lower-layer
loop workers are still copying from them, triggering a use-after-free
reported by syzbot in copy_folio_from_iter_atomic().

Track in-flight log I/O in struct jfs_log and wait for completion before
freeing log buffers. Add io_inflight/io_waitq, increment io_inflight
before submitting BIOs in lbmRead() and lbmStartIO(), and decrement it
in lbmIODone() at the unified out: label, which all completion paths
including READ, DIRECT, synchronous, GC, asynchronous converge on.

This closes the teardown race between buffer page free and late I/O
completion.

Reported-by: syzbot+6cc93ec9a4035badb85f@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=6cc93ec9a4035badb85f
Signed-off-by: Mashiro Chen <mashiro.chen@mailbox.org>
---
#syz test: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master

 fs/jfs/jfs_logmgr.c | 11 +++++++++--
 fs/jfs/jfs_logmgr.h |  2 ++
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c
index 306165e61438..a567dae3b908 100644
--- a/fs/jfs/jfs_logmgr.c
+++ b/fs/jfs/jfs_logmgr.c
@@ -1804,6 +1804,8 @@ static int lbmLogInit(struct jfs_log * log)
 	 * avoid deadlock here.
 	 */
 	init_waitqueue_head(&log->free_wait);
+	init_waitqueue_head(&log->io_waitq);
+	atomic_set(&log->io_inflight, 0);
 
 	log->lbuf_free = NULL;
 
@@ -1855,6 +1857,8 @@ static void lbmLogShutdown(struct jfs_log * log)
 
 	jfs_info("lbmLogShutdown: log:0x%p", log);
 
+	wait_event(log->io_waitq, !atomic_read(&log->io_inflight));
+
 	lbuf = log->lbuf_free;
 	while (lbuf) {
 		struct lbuf *next = lbuf->l_freelist;
@@ -1976,6 +1980,7 @@ static int lbmRead(struct jfs_log * log, int pn, struct lbuf ** bpp)
 
 	bio->bi_end_io = lbmIODone;
 	bio->bi_private = bp;
+	atomic_inc(&log->io_inflight);
 	/*check if journaling to disk has been disabled*/
 	if (log->no_integrity) {
 		bio->bi_iter.bi_size = 0;
@@ -2122,6 +2127,7 @@ static void lbmStartIO(struct lbuf * bp)
 
 	bio->bi_end_io = lbmIODone;
 	bio->bi_private = bp;
+	atomic_inc(&log->io_inflight);
 
 	/* check if journaling to disk has been disabled */
 	if (log->no_integrity) {
@@ -2168,7 +2174,7 @@ static void lbmIODone(struct bio *bio)
 {
 	struct lbuf *bp = bio->bi_private;
 	struct lbuf *nextbp, *tail;
-	struct jfs_log *log;
+	struct jfs_log *log = bp->l_log;
 	unsigned long flags;
 
 	/*
@@ -2214,7 +2220,6 @@ static void lbmIODone(struct bio *bio)
 	INCREMENT(lmStat.pagedone);
 
 	/* update committed lsn */
-	log = bp->l_log;
 	log->clsn = (bp->l_pn << L2LOGPSIZE) + bp->l_ceor;
 
 	if (bp->l_flag & lbmDIRECT) {
@@ -2299,6 +2304,8 @@ static void lbmIODone(struct bio *bio)
 out:
 	bp->l_flag |= lbmDONE;
 	LCACHE_UNLOCK(flags);
+	if (atomic_dec_and_test(&log->io_inflight))
+		wake_up(&log->io_waitq);
 }
 
 int jfsIOWait(void *arg)
diff --git a/fs/jfs/jfs_logmgr.h b/fs/jfs/jfs_logmgr.h
index 09e0ef6aecce..31b826d546c0 100644
--- a/fs/jfs/jfs_logmgr.h
+++ b/fs/jfs/jfs_logmgr.h
@@ -400,6 +400,8 @@ struct jfs_log {
 	uuid_t uuid;		/* 16: 128-bit uuid of log device */
 
 	int no_integrity;	/* 3: flag to disable journaling to disk */
+	atomic_t io_inflight;
+	wait_queue_head_t io_waitq;
 };
 
 /*
-- 
2.54.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-04-25 11:24 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-30  9:56 [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2) syzbot
2026-04-16 10:23 ` syzbot
2026-04-17 20:43 ` Forwarded: " syzbot
2026-04-20  4:08 ` syzbot
2026-04-20  4:11 ` syzbot
2026-04-23 13:26 ` Forwarded: [PATCH 1/1] jfs: try syzbot fix syzbot
2026-04-24 21:16 ` Forwarded: Re: [syzbot] [mm?] KASAN: use-after-free Read in copy_folio_from_iter_atomic (2) syzbot
2026-04-25 11:24 ` Forwarded: [PATCH] jfs: fix use-after-free on log shutdown syzbot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.