There will be registered buffers that have never had a userspace mapping and to use them the file have to work with iterators. Fail loop_rw_iter() if it meets such a buffer. Signed-off-by: Pavel Begunkov <asml.silence@xxxxxxxxx> --- io_uring/rw.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/io_uring/rw.c b/io_uring/rw.c index 6c7d2654770e..b2ad99e0e304 100644 --- a/io_uring/rw.c +++ b/io_uring/rw.c @@ -428,11 +428,18 @@ static inline loff_t *io_kiocb_ppos(struct kiocb *kiocb) */ static ssize_t loop_rw_iter(int ddir, struct io_rw *rw, struct iov_iter *iter) { + struct io_kiocb *req = cmd_to_io_kiocb(rw); struct kiocb *kiocb = &rw->kiocb; struct file *file = kiocb->ki_filp; ssize_t ret = 0; loff_t *ppos; + if (req->opcode == IORING_OP_READ_FIXED || + req->opcode == IORING_OP_WRITE_FIXED) { + if (!req->imu->ubuf) + return -EFAULT; + } + /* * Don't support polled IO through this interface, and we can't * support non-blocking either. For the latter, this just causes -- 2.40.0