Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

io_uring/net: combine msghdr copy

Call the compat version from inside of io_msg_copy_hdr() and don't
duplicate it in callers.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/25795660f7b31f9273911c99f495d9c2b169ecda.1741362889.git.asml.silence@gmail.com
[axboe: fixup msg pointer vs variable braino in io_msg_copy_hdr()]
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Pavel Begunkov and committed by
Jens Axboe
17523a82 835c4bdf

+19 -27
+19 -27
io_uring/net.c
··· 287 287 struct user_msghdr __user *umsg = sr->umsg; 288 288 int ret; 289 289 290 + iomsg->msg.msg_name = &iomsg->addr; 291 + iomsg->msg.msg_iter.nr_segs = 0; 292 + 293 + if (io_is_compat(req->ctx)) { 294 + struct compat_msghdr cmsg; 295 + 296 + ret = io_compat_msg_copy_hdr(req, iomsg, &cmsg, ddir, save_addr); 297 + if (ret) 298 + return ret; 299 + 300 + memset(msg, 0, sizeof(*msg)); 301 + msg->msg_namelen = cmsg.msg_namelen; 302 + msg->msg_controllen = cmsg.msg_controllen; 303 + msg->msg_iov = compat_ptr(cmsg.msg_iov); 304 + msg->msg_iovlen = cmsg.msg_iovlen; 305 + return 0; 306 + } 307 + 290 308 ret = io_copy_msghdr_from_user(msg, umsg); 291 309 if (unlikely(ret)) 292 310 return ret; ··· 340 322 struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg); 341 323 struct user_msghdr msg; 342 324 int ret; 343 - 344 - iomsg->msg.msg_name = &iomsg->addr; 345 - iomsg->msg.msg_iter.nr_segs = 0; 346 - 347 - if (io_is_compat(req->ctx)) { 348 - struct compat_msghdr cmsg; 349 - 350 - ret = io_compat_msg_copy_hdr(req, iomsg, &cmsg, ITER_SOURCE, 351 - NULL); 352 - sr->msg_control = iomsg->msg.msg_control_user; 353 - return ret; 354 - } 355 325 356 326 ret = io_msg_copy_hdr(req, iomsg, &msg, ITER_SOURCE, NULL); 357 327 /* save msg_control as sys_sendmsg() overwrites it */ ··· 716 710 struct user_msghdr msg; 717 711 int ret; 718 712 719 - iomsg->msg.msg_name = &iomsg->addr; 720 - iomsg->msg.msg_iter.nr_segs = 0; 721 - 722 - if (io_is_compat(req->ctx)) { 723 - struct compat_msghdr cmsg; 724 - 725 - ret = io_compat_msg_copy_hdr(req, iomsg, &cmsg, ITER_DEST, 726 - &iomsg->uaddr); 727 - memset(&msg, 0, sizeof(msg)); 728 - msg.msg_namelen = cmsg.msg_namelen; 729 - msg.msg_controllen = cmsg.msg_controllen; 730 - } else { 731 - ret = io_msg_copy_hdr(req, iomsg, &msg, ITER_DEST, &iomsg->uaddr); 732 - } 733 - 713 + ret = io_msg_copy_hdr(req, iomsg, &msg, ITER_DEST, &iomsg->uaddr); 734 714 if (unlikely(ret)) 735 715 return ret; 736 716 return io_recvmsg_mshot_prep(req, iomsg, msg.msg_namelen,