Skip to content

Commit

Permalink
io_uring/rsrc: disallow multi-source reg buffers
Browse files Browse the repository at this point in the history
If two or more mappings go back to back to each other they can be passed
into io_uring to be registered as a single registered buffer. That would
even work if mappings came from different sources, e.g. it's possible to
mix in this way anon pages and pages from shmem or hugetlb. That is not
a problem but it'd rather be less prone if we forbid such mixing.

Cc: <stable@vger.kernel.org>
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
  • Loading branch information
Pavel Begunkov authored and Jens Axboe committed Feb 22, 2023
1 parent 9a1563d commit edd4782
Showing 1 changed file with 8 additions and 5 deletions.
13 changes: 8 additions & 5 deletions io_uring/rsrc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1162,14 +1162,17 @@ struct page **io_pin_pages(unsigned long ubuf, unsigned long len, int *npages)
pret = pin_user_pages(ubuf, nr_pages, FOLL_WRITE | FOLL_LONGTERM,
pages, vmas);
if (pret == nr_pages) {
struct file *file = vmas[0]->vm_file;

/* don't support file backed memory */
for (i = 0; i < nr_pages; i++) {
struct vm_area_struct *vma = vmas[i];

if (vma_is_shmem(vma))
if (vmas[i]->vm_file != file) {
ret = -EINVAL;
break;
}
if (!file)
continue;
if (vma->vm_file &&
!is_file_hugepages(vma->vm_file)) {
if (!vma_is_shmem(vmas[i]) && !is_file_hugepages(file)) {
ret = -EOPNOTSUPP;
break;
}
Expand Down

0 comments on commit edd4782

Please sign in to comment.