Re: [syzbot] WARNING in mntput_no_expire (2)

Christian Brauner
2021-04-05T11:44:44Z

On Sun, Apr 04, 2021 at 08:17:21PM +0000, Al Viro wrote:
> On Sun, Apr 04, 2021 at 06:50:10PM +0000, Al Viro wrote:
>
> > > Yeah, I have at least namei.o
> > >
> > > https://drive.google.com/file/d/1AvO1St0YltIrA86DXjp1Xg3ojtS9owGh/view?usp=sharing
> >
> > *grumble*
> >
> > Is it reproducible without KASAN? Would be much easier to follow the produced
> > asm...
>
> Looks like inode_permission(_, NULL, _) from may_lookup(nd). I.e.
> nd->inode == NULL.

Yeah, I already saw that.

>
> Mind slapping BUG_ON(!nd->inode) right before may_lookup() call in
> link_path_walk() and trying to reproduce that oops?

Yep, no problem. If you run the reproducer in a loop for a little while
you eventually trigger the BUG_ON() and then you get the following splat
(and then an endless loop) in [1] with nd->inode NULL.

_But_ I managed to debug this further and was able to trigger the BUG_ON()
directly in path_init() in the AT_FDCWD branch (after all its AT_FDCWD(./file0)
with the patch in [3] (it's in LOOKUP_RCU) the corresponding splat is in [2].
So the crash happens for a PF_IO_WORKER thread with a NULL nd->inode for the
PF_IO_WORKER's pwd (The PF_IO_WORKER seems to be in async context.).

[3]:
diff --git a/fs/namei.c b/fs/namei.c
index 28a70diff --git a/fs/namei.c b/fs/namei.c
index 28a7006bdb04..8a31ccb61c45 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -2336,8 +2336,8 @@ static const char *path_init(struct nameidata *nd, unsigned flags)

/* Relative pathname -- get the starting-point it is relative to. */
if (nd->dfd == AT_FDCWD) {
+ struct fs_struct *fs = current->fs;
if (flags & LOOKUP_RCU) {
- struct fs_struct *fs = current->fs;
unsigned seq;

do {
@@ -2347,9 +2347,14 @@ static const char *path_init(struct nameidata *nd, unsigned flags)
nd->seq = __read_seqcount_begin(&nd->path.dentry->d_seq);
} while (read_seqcount_retry(&fs->seq, seq));
} else {
- get_fs_pwd(current->fs, &nd->path);
+ get_fs_pwd(fs, &nd->path);
nd->inode = nd->path.dentry->d_inode;
}
+
+ BUG_ON(!fs->users);
+ BUG_ON(fs->users < 0);
+ BUG_ON(!nd->inode && (current->flags & PF_IO_WORKER));
+ BUG_ON(!nd->inode);
} else {
/* Caller must check execute permissions on the starting path component */
struct fd f = fdget_raw(nd->dfd);

[1]:
[ 257.564526] ------------[ cut here ]------------
[ 257.564549] kernel BUG at fs/namei.c:2208!
[ 257.564998] ------------[ cut here ]------------
[ 257.565773] kernel BUG at fs/namei.c:2208!
[ 257.567632] invalid opcode: 0000 [#1] PREEMPT SMP KASAN
[ 257.569113] CPU: 3 PID: 6086 Comm: uring_viro Tainted: G W E 5.12.0-rc5-b47394a22e3dce3d03165e48ef0462f41c198ac7 #47
[ 257.572028] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009)/LXD, BIOS 0.0.0 02/06/2015
[ 257.573687] RIP: 0010:link_path_walk.part.0+0x6c9/0xd30
[ 257.575008] Code: 00 48 8b 43 18 48 89 44 24 18 48 8b 44 24 38 80 38 00 0f 85 b1 04 00 00 49 8b 6e 30 48 85 ed 0f 85 82 fb ff ff e8 67 35 a8 ff <0f> 0b e8 60 35 a8 ff 49 83 c7 01 48 bf 00 00 00 00 00 fc ff df 4c
[ 257.580853] RSP: 0018:ffffc900052af5c0 EFLAGS: 00010246
[ 257.582513] RAX: 0000000000000000 RBX: ffff88802f7b2da0 RCX: ffffffff8ecd175c
[ 257.584211] RDX: 0000000000000000 RSI: ffff8880133a0000 RDI: 0000000000000002
[ 257.585985] RBP: 0000000000000000 R08: 0000000000000001 R09: fffffbfff388f13e
[ 257.588061] R10: ffff8880322e0353 R11: fffffbfff388f13d R12: ffffc900052af820
[ 257.590059] R13: ffff8880133a0000 R14: ffffc900052af820 R15: ffff888031149120
[ 257.592605] FS: 00007f445b331800(0000) GS:ffff888015b80000(0000) knlGS:0000000000000000
[ 257.595266] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 257.597262] CR2: 00005578c2c17008 CR3: 00000000307a4000 CR4: 0000000000350ee0
[ 257.599546] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[ 257.601331] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[ 257.602938] Call Trace:
[ 257.603764] ? write_comp_data+0x2a/0x90
[ 257.605637] ? __sanitizer_cov_trace_pc+0x1d/0x50
[ 257.607107] ? path_init+0x662/0x1800
[ 257.608713] ? walk_component+0x6a0/0x6a0
[ 257.610125] path_openat+0x269/0x2790
[ 257.611601] ? path_lookupat.isra.0+0x530/0x530
[ 257.613180] ? rcu_read_lock_bh_held+0xb0/0xb0
[ 257.614586] ? lockdep_hardirqs_on_prepare+0x400/0x400
[ 257.615898] do_filp_open+0x197/0x270
[ 257.616881] ? rcu_read_lock_bh_held+0xb0/0xb0
[ 257.618293] ? may_open_dev+0xf0/0xf0
[ 257.619700] ? do_raw_spin_lock+0x125/0x2e0
[ 257.621159] ? write_comp_data+0x2a/0x90
[ 257.622574] ? __sanitizer_cov_trace_pc+0x1d/0x50
[ 257.624271] ? _raw_spin_unlock+0x29/0x40
[ 257.625737] ? alloc_fd+0x499/0x640
[ 257.627075] io_openat2+0x1d1/0x8f0
[ 257.628458] ? io_req_complete_post+0xa90/0xa90
[ 257.629921] ? __lock_acquire+0x1847/0x5850
[ 257.631108] ? write_comp_data+0x2a/0x90
[ 257.632069] io_issue_sqe+0x2a2/0x5ac0
[ 257.633112] ? lockdep_hardirqs_on_prepare+0x400/0x400
[ 257.634534] ? io_poll_complete.constprop.0+0x100/0x100
[ 257.636129] ? rcu_read_lock_sched_held+0xa1/0xd0
[ 257.647374] ? rcu_read_lock_bh_held+0xb0/0xb0
[ 257.656776] ? find_held_lock+0x2d/0x110
[ 257.665481] ? __might_fault+0xd8/0x180
[ 257.674198] __io_queue_sqe+0x19f/0xcf0
[ 257.688028] ? __check_object_size+0x1b4/0x4e0
[ 257.696724] ? __ia32_sys_io_uring_setup+0x70/0x70
[ 257.705177] ? write_comp_data+0x2a/0x90
[ 257.713125] io_queue_sqe+0x612/0xb70
[ 257.720757] io_submit_sqes+0x517d/0x6650
[ 257.733042] ? __x64_sys_io_uring_enter+0xb15/0xdd0
[ 257.741308] __x64_sys_io_uring_enter+0xb15/0xdd0
[ 257.748782] ? __ia32_sys_io_uring_enter+0xdd0/0xdd0
[ 257.756094] ? rcu_read_lock_bh_held+0xb0/0xb0
[ 257.764428] ? syscall_enter_from_user_mode+0x27/0x70
[ 257.773331] do_syscall_64+0x2d/0x70
[ 257.780447] entry_SYSCALL_64_after_hwframe+0x44/0xae
[ 257.787936] RIP: 0033:0x7f445b44767d
[ 257.795186] Code: 00 c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d bb f7 0c 00 f7 d8 64 89 01 48
[ 257.816184] RSP: 002b:00005578c0f91e98 EFLAGS: 00000212 ORIG_RAX: 00000000000001aa
[ 257.824286] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f445b44767d
[ 257.832553] RDX: 0000000000000000 RSI: 00000000000045f5 RDI: 0000000000000003
[ 257.844189] RBP: 00005578c0f91f70 R08: 0000000000000000 R09: 0000000000000000
[ 257.853290] R10: 0000000000000000 R11: 0000000000000212 R12: 00005578c0e64640
[ 257.861454] R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
[ 257.874753] Modules linked in: efi_pstore(E) efivarfs(E)
[ 257.883235] invalid opcode: 0000 [#2] PREEMPT SMP KASAN
[ 257.891763] ---[ end trace a40a2f46a1222bc8 ]---

[2]:
[ 228.106433] ------------[ cut here ]------------
[ 228.106449] kernel BUG at fs/namei.c:2356!
[ 228.106596] ------------[ cut here ]------------
[ 228.109523] invalid opcode: 0000 [#1] PREEMPT SMP KASAN
[ 228.110025] kernel BUG at fs/namei.c:2357!
[ 228.111226] CPU: 1 PID: 6052 Comm: iou-wrk-6049 Tainted: G W E 5.12.0-rc5-cc402ba42485f28e932348e7627433eb1dccef5c #51
[ 228.115791] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009)/LXD, BIOS 0.0.0 02/06/2015
[ 228.118150] RIP: 0010:path_init+0x141c/0x1730
[ 228.119523] Code: fb ff ff 48 c7 c7 00 47 c1 91 e8 4f c9 f0 ff e9 b5 ed ff ff 48 c7 c7 40 46 c1 91 e8 3e c9 f0 ff e9 5b ee ff ff e8 b4 78 a8 ff <0f> 0b 48 8b bd 60 ff ff ff e8 26 c9 f0 ff e9 52 f5 ff ff e8 1c c9
[ 228.124889] RSP: 0018:ffffc90004d8f6c0 EFLAGS: 00010246
[ 228.126702] RAX: 0000000000000000 RBX: 0000000000000010 RCX: ffffffff884cd98c
[ 228.129228] RDX: 0000000000000000 RSI: ffff8880007a9d00 RDI: 0000000000000002
[ 228.131765] RBP: ffffc90004d8f760 R08: 0000000000000001 R09: ffffed10026e1ba2
[ 228.133962] R10: ffff88801370dd0b R11: ffffed10026e1ba1 R12: ffff88801370dd08
[ 228.135843] R13: ffff88801370dd00 R14: ffffc90004d8f8e0 R15: 0000000000000001
[ 228.137812] FS: 00007fd5db164800(0000) GS:ffff888015a80000(0000) knlGS:0000000000000000
[ 228.140069] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 228.141894] CR2: 00007fe892801000 CR3: 0000000036041000 CR4: 0000000000350ee0
[ 228.144485] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[ 228.146914] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[ 228.149326] Call Trace:
[ 228.150372] ? write_comp_data+0x2a/0x90
[ 228.151870] ? percpu_counter_add_batch+0xbc/0x180
[ 228.153667] path_openat+0x192/0x2790
[ 228.155038] ? path_lookupat.isra.0+0x530/0x530
[ 228.156573] ? ret_from_fork+0x1f/0x30
[ 228.157757] ? lockdep_hardirqs_on_prepare+0x400/0x400
[ 228.159136] do_filp_open+0x208/0x270
[ 228.160252] ? rcu_read_lock_bh_held+0xb0/0xb0
[ 228.161598] ? may_open_dev+0xf0/0xf0
[ 228.162653] ? do_raw_spin_lock+0x125/0x2e0
[ 228.163856] ? write_comp_data+0x2a/0x90
[ 228.165213] ? __sanitizer_cov_trace_pc+0x1d/0x50
[ 228.166782] ? _raw_spin_unlock+0x29/0x40
[ 228.168176] ? alloc_fd+0x499/0x640
[ 228.169402] io_openat2+0x1d1/0x8f0
[ 228.170607] ? __lock_acquire+0x1847/0x5850
[ 228.172381] ? io_req_complete_post+0xa90/0xa90
[ 228.174218] ? write_comp_data+0x2a/0x90
[ 228.175843] ? io_issue_sqe+0x5ac0/0x5ac0
[ 228.177600] io_issue_sqe+0x2a2/0x5ac0
[ 228.179183] ? io_poll_complete.constprop.0+0x100/0x100
[ 228.180821] ? find_held_lock+0x2d/0x110
[ 228.181963] ? io_worker_handle_work+0x55d/0x13b0
[ 228.183154] ? lock_downgrade+0x690/0x690
[ 228.192463] ? rwlock_bug.part.0+0x90/0x90
[ 228.202181] ? io_issue_sqe+0x5ac0/0x5ac0
[ 228.211962] io_wq_submit_work+0x1da/0x640
[ 228.227152] ? io_issue_sqe+0x5ac0/0x5ac0
[ 228.236852] io_worker_handle_work+0x70a/0x13b0
[ 228.246583] ? rwlock_bug.part.0+0x90/0x90
[ 228.256009] io_wqe_worker+0x2ec/0xd00
[ 228.264954] ? io_worker_handle_work+0x13b0/0x13b0
[ 228.274045] ? ret_from_fork+0x8/0x30
[ 228.288365] ? lock_downgrade+0x690/0x690
[ 228.297032] ? do_raw_spin_lock+0x125/0x2e0
[ 228.305457] ? rwlock_bug.part.0+0x90/0x90
[ 228.313717] ? write_comp_data+0x2a/0x90
[ 228.321685] ? _raw_spin_unlock_irq+0x24/0x50
[ 228.329596] ? io_worker_handle_work+0x13b0/0x13b0
[ 228.343015] ret_from_fork+0x1f/0x30
[ 228.351033] Modules linked in: efi_pstore(E) efivarfs(E)
[ 228.359699] invalid opcode: 0000 [#2] PREEMPT SMP KASAN
[ 228.370439] CPU: 3 PID: 6049 Comm: uring_viro Tainted: G D W E 5.12.0-rc5-cc402ba42485f28e932348e7627433eb1dccef5c #51
[ 228.394578] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009)/LXD, BIOS 0.0.0 02/06/2015
[ 228.396859] ---[ end trace 5ac6a4c645048000 ]---