On Thu, Apr 13, 2023 at 01:51:29AM +0100, Al Viro wrote: > On Tue, Apr 11, 2023 at 05:08:45PM +0100, David Howells wrote: > > > @@ -2483,6 +2484,7 @@ static int ____sys_sendmsg(struct socket *sock, struct msghdr *msg_sys, > > } > > msg_sys->msg_flags = flags; > > > > + flags &= ~MSG_INTERNAL_SENDMSG_FLAGS; > > if (sock->file->f_flags & O_NONBLOCK) > > msg_sys->msg_flags |= MSG_DONTWAIT; > > A bit too late, innit? There's no users of 'flags' downstream of that > assignment to ->msg_flags, so your &= is a no-op; it should be done > *before* that assignment... While we are at it, io-uring has this: int io_sendmsg_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) { struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg); ... sr->msg_flags = READ_ONCE(sqe->msg_flags) | MSG_NOSIGNAL; and int io_send(struct io_kiocb *req, unsigned int issue_flags) { struct sockaddr_storage __address; struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg); ... flags = sr->msg_flags; if (issue_flags & IO_URING_F_NONBLOCK) flags |= MSG_DONTWAIT; if (flags & MSG_WAITALL) min_ret = iov_iter_count(&msg.msg_iter); msg.msg_flags = flags; ret = sock_sendmsg(sock, &msg); Note that io_sendmsg_prep() handles both IORING_OP_SENDMSG and IORING_OP_SEND, so this pair of functions can hit the same request. And sqe->msg_flags is not sanitized at all - it comes straight from user buffer.