Commit c6e9fa5c authored by Dylan Yudaken's avatar Dylan Yudaken Committed by Jens Axboe

io_uring: fix types in provided buffer ring

The type of head needs to match that of tail in order for rollover and
comparisons to work correctly.

Without this change the comparison of tail to head might incorrectly allow
io_uring to use a buffer that userspace had not given it.

Fixes: c7fb1942 ("io_uring: add support for ring mapped supplied buffers")
Signed-off-by: default avatarDylan Yudaken <dylany@fb.com>
Link: https://lore.kernel.org/r/20220613101157.3687-3-dylany@fb.comReviewed-by: default avatarHao Xu <howeyxu@tencent.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 97da4a53
...@@ -298,8 +298,8 @@ struct io_buffer_list { ...@@ -298,8 +298,8 @@ struct io_buffer_list {
/* below is for ring provided buffers */ /* below is for ring provided buffers */
__u16 buf_nr_pages; __u16 buf_nr_pages;
__u16 nr_entries; __u16 nr_entries;
__u32 head; __u16 head;
__u32 mask; __u16 mask;
}; };
struct io_buffer { struct io_buffer {
...@@ -3876,7 +3876,7 @@ static void __user *io_ring_buffer_select(struct io_kiocb *req, size_t *len, ...@@ -3876,7 +3876,7 @@ static void __user *io_ring_buffer_select(struct io_kiocb *req, size_t *len,
{ {
struct io_uring_buf_ring *br = bl->buf_ring; struct io_uring_buf_ring *br = bl->buf_ring;
struct io_uring_buf *buf; struct io_uring_buf *buf;
__u32 head = bl->head; __u16 head = bl->head;
if (unlikely(smp_load_acquire(&br->tail) == head)) { if (unlikely(smp_load_acquire(&br->tail) == head)) {
io_ring_submit_unlock(req->ctx, issue_flags); io_ring_submit_unlock(req->ctx, issue_flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment