@@ -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
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@gmail.com> --- io_uring/rw.c | 7 +++++++ 1 file changed, 7 insertions(+)