]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
io_uring/net: fix multishot accept overflow handling
authorJens Axboe <axboe@kernel.dk>
Wed, 14 Feb 2024 15:23:05 +0000 (08:23 -0700)
committerJens Axboe <axboe@kernel.dk>
Thu, 15 Feb 2024 01:30:19 +0000 (18:30 -0700)
If we hit CQ ring overflow when attempting to post a multishot accept
completion, we don't properly save the result or return code. This
results in losing the accepted fd value.

Instead, we return the result from the poll operation that triggered
the accept retry. This is generally POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND
which is 0xc3, or 195, which looks like a valid file descriptor, but it
really has no connection to that.

Handle this like we do for other multishot completions - assign the
result, and return IOU_STOP_MULTISHOT to cancel any further completions
from this request when overflow is hit. This preserves the result, as we
should, and tells the application that the request needs to be re-armed.

Cc: stable@vger.kernel.org
Fixes: 515e26961295 ("io_uring: revert "io_uring fix multishot accept ordering"")
Link: https://github.com/axboe/liburing/issues/1062
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/net.c

index 43bc9a5f96f9d1ce48f2d6e2a5cf850c675aee0d..161622029147ca3e6c13784274ea084d05695ccc 100644 (file)
@@ -1372,7 +1372,7 @@ retry:
                         * has already been done
                         */
                        if (issue_flags & IO_URING_F_MULTISHOT)
-                               ret = IOU_ISSUE_SKIP_COMPLETE;
+                               return IOU_ISSUE_SKIP_COMPLETE;
                        return ret;
                }
                if (ret == -ERESTARTSYS)
@@ -1397,7 +1397,8 @@ retry:
                                ret, IORING_CQE_F_MORE))
                goto retry;
 
-       return -ECANCELED;
+       io_req_set_res(req, ret, 0);
+       return IOU_STOP_MULTISHOT;
 }
 
 int io_socket_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)