X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=io_uring%2Fkbuf.c;h=acc37e5a6d4e1d3852ebf31c5fb963bc7fe6e80e;hb=652205cd04dd38488f30fe25afa06b7ba4a155a3;hp=25cd724ade184ac452463d18e134d7e3ae469503;hpb=57646d6769f13f9484ffc6869c493e25a6568073;p=platform%2Fkernel%2Flinux-starfive.git diff --git a/io_uring/kbuf.c b/io_uring/kbuf.c index 25cd724..acc37e5 100644 --- a/io_uring/kbuf.c +++ b/io_uring/kbuf.c @@ -228,17 +228,18 @@ static int __io_remove_buffers(struct io_ring_ctx *ctx, return i; } - /* the head kbuf is the list itself */ + /* protects io_buffers_cache */ + lockdep_assert_held(&ctx->uring_lock); + while (!list_empty(&bl->buf_list)) { struct io_buffer *nxt; nxt = list_first_entry(&bl->buf_list, struct io_buffer, list); - list_del(&nxt->list); + list_move(&nxt->list, &ctx->io_buffers_cache); if (++i == nbufs) return i; cond_resched(); } - i++; return i; } @@ -346,6 +347,8 @@ int io_provide_buffers_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe tmp = READ_ONCE(sqe->off); if (tmp > USHRT_MAX) return -E2BIG; + if (tmp + p->nbufs >= USHRT_MAX) + return -EINVAL; p->bid = tmp; return 0; } @@ -507,7 +510,7 @@ int io_register_pbuf_ring(struct io_ring_ctx *ctx, void __user *arg) } pages = io_pin_pages(reg.ring_addr, - struct_size(br, bufs, reg.ring_entries), + flex_array_size(br, bufs, reg.ring_entries), &nr_pages); if (IS_ERR(pages)) { kfree(free_bl);