All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: Jens Axboe <axboe@kernel.dk>
Cc: oe-kbuild-all@lists.linux.dev, linux-kernel@vger.kernel.org
Subject: io_uring/net.c:206:25: sparse: sparse: incorrect type in assignment (different address spaces)
Date: Wed, 21 Jun 2023 06:05:04 +0800	[thread overview]
Message-ID: <202306210654.mDMcyMuB-lkp@intel.com> (raw)

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   692b7dc87ca6d55ab254f8259e6f970171dc9d01
commit: cac9e4418f4cbd548ccb065b3adcafe073f7f7d2 io_uring/net: save msghdr->msg_control for retries
date:   7 days ago
config: i386-randconfig-s001-20230620 (https://download.01.org/0day-ci/archive/20230621/202306210654.mDMcyMuB-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce: (https://download.01.org/0day-ci/archive/20230621/202306210654.mDMcyMuB-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202306210654.mDMcyMuB-lkp@intel.com/

sparse warnings: (new ones prefixed by >>)
   io_uring/net.c: note: in included file (through io_uring/io_uring.h):
   include/linux/io_uring_types.h:179:37: sparse: sparse: array of flexible structures
>> io_uring/net.c:206:25: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected void [noderef] __user *msg_control @@     got void *msg_control @@
   io_uring/net.c:206:25: sparse:     expected void [noderef] __user *msg_control
   io_uring/net.c:206:25: sparse:     got void *msg_control
>> io_uring/net.c:305:39: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected void *msg_control @@     got void [noderef] __user *msg_control @@
   io_uring/net.c:305:39: sparse:     expected void *msg_control
   io_uring/net.c:305:39: sparse:     got void [noderef] __user *msg_control

vim +206 io_uring/net.c

   194	
   195	static int io_sendmsg_copy_hdr(struct io_kiocb *req,
   196				       struct io_async_msghdr *iomsg)
   197	{
   198		struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg);
   199		int ret;
   200	
   201		iomsg->msg.msg_name = &iomsg->addr;
   202		iomsg->free_iov = iomsg->fast_iov;
   203		ret = sendmsg_copy_msghdr(&iomsg->msg, sr->umsg, sr->msg_flags,
   204						&iomsg->free_iov);
   205		/* save msg_control as sys_sendmsg() overwrites it */
 > 206		sr->msg_control = iomsg->msg.msg_control;
   207		return ret;
   208	}
   209	
   210	int io_send_prep_async(struct io_kiocb *req)
   211	{
   212		struct io_sr_msg *zc = io_kiocb_to_cmd(req, struct io_sr_msg);
   213		struct io_async_msghdr *io;
   214		int ret;
   215	
   216		if (!zc->addr || req_has_async_data(req))
   217			return 0;
   218		io = io_msg_alloc_async_prep(req);
   219		if (!io)
   220			return -ENOMEM;
   221		ret = move_addr_to_kernel(zc->addr, zc->addr_len, &io->addr);
   222		return ret;
   223	}
   224	
   225	static int io_setup_async_addr(struct io_kiocb *req,
   226				      struct sockaddr_storage *addr_storage,
   227				      unsigned int issue_flags)
   228	{
   229		struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg);
   230		struct io_async_msghdr *io;
   231	
   232		if (!sr->addr || req_has_async_data(req))
   233			return -EAGAIN;
   234		io = io_msg_alloc_async(req, issue_flags);
   235		if (!io)
   236			return -ENOMEM;
   237		memcpy(&io->addr, addr_storage, sizeof(io->addr));
   238		return -EAGAIN;
   239	}
   240	
   241	int io_sendmsg_prep_async(struct io_kiocb *req)
   242	{
   243		int ret;
   244	
   245		if (!io_msg_alloc_async_prep(req))
   246			return -ENOMEM;
   247		ret = io_sendmsg_copy_hdr(req, req->async_data);
   248		if (!ret)
   249			req->flags |= REQ_F_NEED_CLEANUP;
   250		return ret;
   251	}
   252	
   253	void io_sendmsg_recvmsg_cleanup(struct io_kiocb *req)
   254	{
   255		struct io_async_msghdr *io = req->async_data;
   256	
   257		kfree(io->free_iov);
   258	}
   259	
   260	int io_sendmsg_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
   261	{
   262		struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg);
   263	
   264		if (req->opcode == IORING_OP_SEND) {
   265			if (READ_ONCE(sqe->__pad3[0]))
   266				return -EINVAL;
   267			sr->addr = u64_to_user_ptr(READ_ONCE(sqe->addr2));
   268			sr->addr_len = READ_ONCE(sqe->addr_len);
   269		} else if (sqe->addr2 || sqe->file_index) {
   270			return -EINVAL;
   271		}
   272	
   273		sr->umsg = u64_to_user_ptr(READ_ONCE(sqe->addr));
   274		sr->len = READ_ONCE(sqe->len);
   275		sr->flags = READ_ONCE(sqe->ioprio);
   276		if (sr->flags & ~IORING_RECVSEND_POLL_FIRST)
   277			return -EINVAL;
   278		sr->msg_flags = READ_ONCE(sqe->msg_flags) | MSG_NOSIGNAL;
   279		if (sr->msg_flags & MSG_DONTWAIT)
   280			req->flags |= REQ_F_NOWAIT;
   281	
   282	#ifdef CONFIG_COMPAT
   283		if (req->ctx->compat)
   284			sr->msg_flags |= MSG_CMSG_COMPAT;
   285	#endif
   286		sr->done_io = 0;
   287		return 0;
   288	}
   289	
   290	int io_sendmsg(struct io_kiocb *req, unsigned int issue_flags)
   291	{
   292		struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg);
   293		struct io_async_msghdr iomsg, *kmsg;
   294		struct socket *sock;
   295		unsigned flags;
   296		int min_ret = 0;
   297		int ret;
   298	
   299		sock = sock_from_file(req->file);
   300		if (unlikely(!sock))
   301			return -ENOTSOCK;
   302	
   303		if (req_has_async_data(req)) {
   304			kmsg = req->async_data;
 > 305			kmsg->msg.msg_control = sr->msg_control;
   306		} else {
   307			ret = io_sendmsg_copy_hdr(req, &iomsg);
   308			if (ret)
   309				return ret;
   310			kmsg = &iomsg;
   311		}
   312	
   313		if (!(req->flags & REQ_F_POLLED) &&
   314		    (sr->flags & IORING_RECVSEND_POLL_FIRST))
   315			return io_setup_async_msg(req, kmsg, issue_flags);
   316	
   317		flags = sr->msg_flags;
   318		if (issue_flags & IO_URING_F_NONBLOCK)
   319			flags |= MSG_DONTWAIT;
   320		if (flags & MSG_WAITALL)
   321			min_ret = iov_iter_count(&kmsg->msg.msg_iter);
   322	
   323		ret = __sys_sendmsg_sock(sock, &kmsg->msg, flags);
   324	
   325		if (ret < min_ret) {
   326			if (ret == -EAGAIN && (issue_flags & IO_URING_F_NONBLOCK))
   327				return io_setup_async_msg(req, kmsg, issue_flags);
   328			if (ret > 0 && io_net_retry(sock, flags)) {
   329				sr->done_io += ret;
   330				req->flags |= REQ_F_PARTIAL_IO;
   331				return io_setup_async_msg(req, kmsg, issue_flags);
   332			}
   333			if (ret == -ERESTARTSYS)
   334				ret = -EINTR;
   335			req_set_fail(req);
   336		}
   337		/* fast path, check for non-NULL to avoid function call */
   338		if (kmsg->free_iov)
   339			kfree(kmsg->free_iov);
   340		req->flags &= ~REQ_F_NEED_CLEANUP;
   341		io_netmsg_recycle(req, issue_flags);
   342		if (ret >= 0)
   343			ret += sr->done_io;
   344		else if (sr->done_io)
   345			ret = sr->done_io;
   346		io_req_set_res(req, ret, 0);
   347		return IOU_OK;
   348	}
   349	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

                 reply	other threads:[~2023-06-20 22:05 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202306210654.mDMcyMuB-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=axboe@kernel.dk \
    --cc=linux-kernel@vger.kernel.org \
    --cc=oe-kbuild-all@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.