projects
/
linux-block.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
0918682
)
io_uring: fix error path cleanup in io_sqe_files_register()
author
Jens Axboe
<axboe@kernel.dk>
Wed, 14 Oct 2020 13:35:57 +0000
(07:35 -0600)
committer
Jens Axboe
<axboe@kernel.dk>
Sat, 17 Oct 2020 15:25:44 +0000
(09:25 -0600)
syzbot reports the following crash:
general protection fault, probably for non-canonical address 0xdffffc0000000000: 0000 [#1] PREEMPT SMP KASAN
KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007]
CPU: 1 PID: 8927 Comm: syz-executor.3 Not tainted 5.9.0-syzkaller #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
RIP: 0010:io_file_from_index fs/io_uring.c:5963 [inline]
RIP: 0010:io_sqe_files_register fs/io_uring.c:7369 [inline]
RIP: 0010:__io_uring_register fs/io_uring.c:9463 [inline]
RIP: 0010:__do_sys_io_uring_register+0x2fd2/0x3ee0 fs/io_uring.c:9553
Code: ec 03 49 c1 ee 03 49 01 ec 49 01 ee e8 57 61 9c ff 41 80 3c 24 00 0f 85 9b 09 00 00 4d 8b af b8 01 00 00 4c 89 e8 48 c1 e8 03 <80> 3c 28 00 0f 85 76 09 00 00 49 8b 55 00 89 d8 c1 f8 09 48 98 4c
RSP: 0018:
ffffc90009137d68
EFLAGS:
00010246
RAX:
0000000000000000
RBX:
0000000000000000
RCX:
ffffc9000ef2a000
RDX:
0000000000040000
RSI:
ffffffff81d81dd9
RDI:
0000000000000005
RBP:
dffffc0000000000
R08:
0000000000000001
R09:
0000000000000000
R10:
0000000000000000
R11:
0000000000000000
R12:
ffffed1012882a37
R13:
0000000000000000
R14:
ffffed1012882a38
R15:
ffff888094415000
FS:
00007f4266f3c700
(0000) GS:
ffff8880ae500000
(0000) knlGS:
0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0:
0000000080050033
CR2:
000000000118c000
CR3:
000000008e57d000
CR4:
00000000001506e0
DR0:
0000000000000000
DR1:
0000000000000000
DR2:
0000000000000000
DR3:
0000000000000000
DR6:
00000000fffe0ff0
DR7:
0000000000000400
Call Trace:
do_syscall_64+0x2d/0x70 arch/x86/entry/common.c:46
entry_SYSCALL_64_after_hwframe+0x44/0xa9
RIP: 0033:0x45de59
Code: 0d b4 fb ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 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 0f 83 db b3 fb ff c3 66 2e 0f 1f 84 00 00 00 00
RSP: 002b:
00007f4266f3bc78
EFLAGS:
00000246
ORIG_RAX:
00000000000001ab
RAX:
ffffffffffffffda
RBX:
00000000000083c0
RCX:
000000000045de59
RDX:
0000000020000280
RSI:
0000000000000002
RDI:
0000000000000005
RBP:
000000000118bf68
R08:
0000000000000000
R09:
0000000000000000
R10:
40000000000000a1
R11:
0000000000000246
R12:
000000000118bf2c
R13:
00007fff2fa4f12f
R14:
00007f4266f3c9c0
R15:
000000000118bf2c
Modules linked in:
---[ end trace
2a40a195e2d5e6e6
]---
RIP: 0010:io_file_from_index fs/io_uring.c:5963 [inline]
RIP: 0010:io_sqe_files_register fs/io_uring.c:7369 [inline]
RIP: 0010:__io_uring_register fs/io_uring.c:9463 [inline]
RIP: 0010:__do_sys_io_uring_register+0x2fd2/0x3ee0 fs/io_uring.c:9553
Code: ec 03 49 c1 ee 03 49 01 ec 49 01 ee e8 57 61 9c ff 41 80 3c 24 00 0f 85 9b 09 00 00 4d 8b af b8 01 00 00 4c 89 e8 48 c1 e8 03 <80> 3c 28 00 0f 85 76 09 00 00 49 8b 55 00 89 d8 c1 f8 09 48 98 4c
RSP: 0018:
ffffc90009137d68
EFLAGS:
00010246
RAX:
0000000000000000
RBX:
0000000000000000
RCX:
ffffc9000ef2a000
RDX:
0000000000040000
RSI:
ffffffff81d81dd9
RDI:
0000000000000005
RBP:
dffffc0000000000
R08:
0000000000000001
R09:
0000000000000000
R10:
0000000000000000
R11:
0000000000000000
R12:
ffffed1012882a37
R13:
0000000000000000
R14:
ffffed1012882a38
R15:
ffff888094415000
FS:
00007f4266f3c700
(0000) GS:
ffff8880ae400000
(0000) knlGS:
0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0:
0000000080050033
CR2:
000000000074a918
CR3:
000000008e57d000
CR4:
00000000001506f0
DR0:
0000000000000000
DR1:
0000000000000000
DR2:
0000000000000000
DR3:
0000000000000000
DR6:
00000000fffe0ff0
DR7:
0000000000000400
which is a copy of fget failure condition jumping to cleanup, but the
cleanup requires ctx->file_data to be assigned. Assign it when setup,
and ensure that we clear it again for the error path exit.
Fixes:
5398ae698525
("io_uring: clean file_data access in files_register")
Reported-by: syzbot+f4ebcc98223dafd8991e@syzkaller.appspotmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c
patch
|
blob
|
blame
|
history
diff --git
a/fs/io_uring.c
b/fs/io_uring.c
index 94a66a6d1cbadd7bc50603bd5b045233b48d6cf2..21c6ce15b751458dbc43e237b91290461e41f70e 100644
(file)
--- a/
fs/io_uring.c
+++ b/
fs/io_uring.c
@@
-7289,6
+7289,7
@@
static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
if (io_sqe_alloc_file_tables(file_data, nr_tables, nr_args))
goto out_ref;
+ ctx->file_data = file_data;
for (i = 0; i < nr_args; i++, ctx->nr_user_files++) {
struct fixed_file_table *table;
@@
-7323,7
+7324,6
@@
static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
table->files[index] = file;
}
- ctx->file_data = file_data;
ret = io_sqe_files_scm(ctx);
if (ret) {
io_sqe_files_unregister(ctx);
@@
-7356,6
+7356,7
@@
out_ref:
out_free:
kfree(file_data->table);
kfree(file_data);
+ ctx->file_data = NULL;
return ret;
}