Skip to content

Commit 02a4d92

Browse files
Savino Dicanosaaxboe
authored andcommitted
io_uring/rsrc: fix null-ptr-deref in io_file_bitmap_get()
When fixed files are unregistered, file_alloc_end and alloc_hint are not cleared. This can later cause a NULL pointer dereference in io_file_bitmap_get() if auto index selection is enabled via IORING_FILE_INDEX_ALLOC: [ 6.519129] BUG: kernel NULL pointer dereference, address: 0000000000000000 [...] [ 6.541468] RIP: 0010:_find_next_zero_bit+0x1a/0x70 [...] [ 6.560906] Call Trace: [ 6.561322] <TASK> [ 6.561672] io_file_bitmap_get+0x38/0x60 [ 6.562281] io_fixed_fd_install+0x63/0xb0 [ 6.562851] ? __pfx_io_socket+0x10/0x10 [ 6.563396] io_socket+0x93/0xf0 [ 6.563855] ? __pfx_io_socket+0x10/0x10 [ 6.564411] io_issue_sqe+0x5b/0x3d0 [ 6.564914] io_submit_sqes+0x1de/0x650 [ 6.565452] __do_sys_io_uring_enter+0x4fc/0xb20 [ 6.566083] ? __do_sys_io_uring_register+0x11e/0xd80 [ 6.566779] do_syscall_64+0x3c/0x90 [ 6.567247] entry_SYSCALL_64_after_hwframe+0x72/0xdc [...] To fix the issue, set file alloc range and alloc_hint to zero after file tables are freed. Cc: [email protected] Fixes: 4278a0d ("io_uring: defer alloc_hint update to io_file_bitmap_set()") Signed-off-by: Savino Dicanosa <[email protected]> [axboe: add explicit bitmap == NULL check as well] Signed-off-by: Jens Axboe <[email protected]>
1 parent 74e2e17 commit 02a4d92

File tree

2 files changed

+4
-0
lines changed

2 files changed

+4
-0
lines changed

io_uring/filetable.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ static int io_file_bitmap_get(struct io_ring_ctx *ctx)
1919
unsigned long nr = ctx->file_alloc_end;
2020
int ret;
2121

22+
if (!table->bitmap)
23+
return -ENFILE;
24+
2225
do {
2326
ret = find_next_zero_bit(table->bitmap, nr, table->alloc_hint);
2427
if (ret != nr)

io_uring/rsrc.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,7 @@ void __io_sqe_files_unregister(struct io_ring_ctx *ctx)
794794
}
795795
#endif
796796
io_free_file_tables(&ctx->file_table);
797+
io_file_table_set_alloc_range(ctx, 0, 0);
797798
io_rsrc_data_free(ctx->file_data);
798799
ctx->file_data = NULL;
799800
ctx->nr_user_files = 0;

0 commit comments

Comments
 (0)