Skip to content

Commit b537916

Browse files
committed
io_uring: retain sockaddr_storage across send/recvmsg async punt
Jonas reports that he sometimes sees -97/-22 error returns from sendmsg, if it gets punted async. This is due to not retaining the sockaddr_storage between calls. Include that in the state we copy when going async. Cc: [email protected] # 5.3+ Reported-by: Jonas Bonn <[email protected]> Tested-by: Jonas Bonn <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent 6ab2314 commit b537916

File tree

1 file changed

+5
-6
lines changed

1 file changed

+5
-6
lines changed

fs/io_uring.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,7 @@ struct io_async_msghdr {
442442
struct iovec *iov;
443443
struct sockaddr __user *uaddr;
444444
struct msghdr msg;
445+
struct sockaddr_storage addr;
445446
};
446447

447448
struct io_async_rw {
@@ -3032,12 +3033,11 @@ static int io_sendmsg(struct io_kiocb *req, struct io_kiocb **nxt,
30323033
sock = sock_from_file(req->file, &ret);
30333034
if (sock) {
30343035
struct io_async_ctx io;
3035-
struct sockaddr_storage addr;
30363036
unsigned flags;
30373037

30383038
if (req->io) {
30393039
kmsg = &req->io->msg;
3040-
kmsg->msg.msg_name = &addr;
3040+
kmsg->msg.msg_name = &req->io->msg.addr;
30413041
/* if iov is set, it's allocated already */
30423042
if (!kmsg->iov)
30433043
kmsg->iov = kmsg->fast_iov;
@@ -3046,7 +3046,7 @@ static int io_sendmsg(struct io_kiocb *req, struct io_kiocb **nxt,
30463046
struct io_sr_msg *sr = &req->sr_msg;
30473047

30483048
kmsg = &io.msg;
3049-
kmsg->msg.msg_name = &addr;
3049+
kmsg->msg.msg_name = &io.msg.addr;
30503050

30513051
io.msg.iov = io.msg.fast_iov;
30523052
ret = sendmsg_copy_msghdr(&io.msg.msg, sr->msg,
@@ -3185,12 +3185,11 @@ static int io_recvmsg(struct io_kiocb *req, struct io_kiocb **nxt,
31853185
sock = sock_from_file(req->file, &ret);
31863186
if (sock) {
31873187
struct io_async_ctx io;
3188-
struct sockaddr_storage addr;
31893188
unsigned flags;
31903189

31913190
if (req->io) {
31923191
kmsg = &req->io->msg;
3193-
kmsg->msg.msg_name = &addr;
3192+
kmsg->msg.msg_name = &req->io->msg.addr;
31943193
/* if iov is set, it's allocated already */
31953194
if (!kmsg->iov)
31963195
kmsg->iov = kmsg->fast_iov;
@@ -3199,7 +3198,7 @@ static int io_recvmsg(struct io_kiocb *req, struct io_kiocb **nxt,
31993198
struct io_sr_msg *sr = &req->sr_msg;
32003199

32013200
kmsg = &io.msg;
3202-
kmsg->msg.msg_name = &addr;
3201+
kmsg->msg.msg_name = &io.msg.addr;
32033202

32043203
io.msg.iov = io.msg.fast_iov;
32053204
ret = recvmsg_copy_msghdr(&io.msg.msg, sr->msg,

0 commit comments

Comments
 (0)