@@ -74,10 +74,8 @@ struct io_sr_msg {
7474 unsigned nr_multishot_loops ;
7575 u16 flags ;
7676 /* initialised and used only by !msg send variants */
77- u16 addr_len ;
7877 u16 buf_group ;
7978 u16 buf_index ;
80- void __user * addr ;
8179 void __user * msg_control ;
8280 /* used only for send zerocopy */
8381 struct io_kiocb * notif ;
@@ -357,24 +355,31 @@ void io_sendmsg_recvmsg_cleanup(struct io_kiocb *req)
357355 io_netmsg_iovec_free (io );
358356}
359357
360- static int io_send_setup (struct io_kiocb * req )
358+ static int io_send_setup (struct io_kiocb * req , const struct io_uring_sqe * sqe )
361359{
362360 struct io_sr_msg * sr = io_kiocb_to_cmd (req , struct io_sr_msg );
363361 struct io_async_msghdr * kmsg = req -> async_data ;
362+ void __user * addr ;
363+ u16 addr_len ;
364364 int ret ;
365365
366+ if (READ_ONCE (sqe -> __pad3 [0 ]))
367+ return - EINVAL ;
368+
366369 kmsg -> msg .msg_name = NULL ;
367370 kmsg -> msg .msg_namelen = 0 ;
368371 kmsg -> msg .msg_control = NULL ;
369372 kmsg -> msg .msg_controllen = 0 ;
370373 kmsg -> msg .msg_ubuf = NULL ;
371374
372- if (sr -> addr ) {
373- ret = move_addr_to_kernel (sr -> addr , sr -> addr_len , & kmsg -> addr );
375+ addr = u64_to_user_ptr (READ_ONCE (sqe -> addr2 ));
376+ addr_len = READ_ONCE (sqe -> addr_len );
377+ if (addr ) {
378+ ret = move_addr_to_kernel (addr , addr_len , & kmsg -> addr );
374379 if (unlikely (ret < 0 ))
375380 return ret ;
376381 kmsg -> msg .msg_name = & kmsg -> addr ;
377- kmsg -> msg .msg_namelen = sr -> addr_len ;
382+ kmsg -> msg .msg_namelen = addr_len ;
378383 }
379384 if (!io_do_buffer_select (req )) {
380385 ret = import_ubuf (ITER_SOURCE , sr -> buf , sr -> len ,
@@ -404,13 +409,9 @@ int io_sendmsg_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
404409
405410 sr -> done_io = 0 ;
406411
407- if (req -> opcode = = IORING_OP_SEND ) {
408- if (READ_ONCE ( sqe -> __pad3 [ 0 ]) )
412+ if (req -> opcode ! = IORING_OP_SEND ) {
413+ if (sqe -> addr2 || sqe -> file_index )
409414 return - EINVAL ;
410- sr -> addr = u64_to_user_ptr (READ_ONCE (sqe -> addr2 ));
411- sr -> addr_len = READ_ONCE (sqe -> addr_len );
412- } else if (sqe -> addr2 || sqe -> file_index ) {
413- return - EINVAL ;
414415 }
415416
416417 sr -> umsg = u64_to_user_ptr (READ_ONCE (sqe -> addr ));
@@ -438,7 +439,7 @@ int io_sendmsg_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
438439 if (unlikely (!io_msg_alloc_async (req )))
439440 return - ENOMEM ;
440441 if (req -> opcode != IORING_OP_SENDMSG )
441- return io_send_setup (req );
442+ return io_send_setup (req , sqe );
442443 return io_sendmsg_setup (req );
443444}
444445
@@ -1254,12 +1255,7 @@ int io_send_zc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
12541255 }
12551256 }
12561257
1257- if (req -> opcode == IORING_OP_SEND_ZC ) {
1258- if (READ_ONCE (sqe -> __pad3 [0 ]))
1259- return - EINVAL ;
1260- zc -> addr = u64_to_user_ptr (READ_ONCE (sqe -> addr2 ));
1261- zc -> addr_len = READ_ONCE (sqe -> addr_len );
1262- } else {
1258+ if (req -> opcode != IORING_OP_SEND_ZC ) {
12631259 if (unlikely (sqe -> addr2 || sqe -> file_index ))
12641260 return - EINVAL ;
12651261 if (unlikely (zc -> flags & IORING_RECVSEND_FIXED_BUF ))
@@ -1280,7 +1276,7 @@ int io_send_zc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
12801276 if (unlikely (!io_msg_alloc_async (req )))
12811277 return - ENOMEM ;
12821278 if (req -> opcode != IORING_OP_SENDMSG_ZC )
1283- return io_send_setup (req );
1279+ return io_send_setup (req , sqe );
12841280 return io_sendmsg_setup (req );
12851281}
12861282
0 commit comments