OSDN Git Service

io_uring: fix zero len do_splice()
authorPavel Begunkov <asml.silence@gmail.com>
Mon, 4 May 2020 20:00:54 +0000 (23:00 +0300)
committerJens Axboe <axboe@kernel.dk>
Sat, 9 May 2020 16:16:10 +0000 (10:16 -0600)
do_splice() doesn't expect len to be 0. Just always return 0 in this
case as splice(2) does.

Fixes: 7d67af2c0134 ("io_uring: add splice(2) support")
Reported-by: Jann Horn <jannh@google.com>
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index 979d9f9..4c2fe06 100644 (file)
@@ -2767,16 +2767,19 @@ static int io_splice(struct io_kiocb *req, bool force_nonblock)
        struct file *out = sp->file_out;
        unsigned int flags = sp->flags & ~SPLICE_F_FD_IN_FIXED;
        loff_t *poff_in, *poff_out;
-       long ret;
+       long ret = 0;
 
        if (force_nonblock)
                return -EAGAIN;
 
        poff_in = (sp->off_in == -1) ? NULL : &sp->off_in;
        poff_out = (sp->off_out == -1) ? NULL : &sp->off_out;
-       ret = do_splice(in, poff_in, out, poff_out, sp->len, flags);
-       if (force_nonblock && ret == -EAGAIN)
-               return -EAGAIN;
+
+       if (sp->len) {
+               ret = do_splice(in, poff_in, out, poff_out, sp->len, flags);
+               if (force_nonblock && ret == -EAGAIN)
+                       return -EAGAIN;
+       }
 
        io_put_file(req, in, (sp->flags & SPLICE_F_FD_IN_FIXED));
        req->flags &= ~REQ_F_NEED_CLEANUP;