io_uring: fix zero len do_splice()
do_splice() doesn't expect len to be 0. Just always return 0 in this
case as splice(2) does.
Fixes: 7d67af2c01
("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>
This commit is contained in:
Родитель
63ff822358
Коммит
c96874265c
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче