From nobody Mon Apr 13 08:03:20 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1679493423; cv=none; d=zohomail.com; s=zohoarc; b=Yi//e2SejN1cadMaAM2UaRtcvhCMCpqBylMwZrPQXGngQF2ESPbOsz38pfl6m8377patZYvMQoZmURWGMhIOoXaMfo4fk0M8Y+3xXsTTj8O6vaxGO8FWuxc3K/MZuBLTN/YRettVmDM7D5ogj5Bo+RY1OXZAtjLw4Ti06QoN1+E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1679493423; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=QtS3YWGo7RY6tVsuPyos429cdA5Trk9Ko9ArMj/GbFM=; b=OldzweIlLAcb9CwozVjgGabrgKozCfTuG/FXYuas25FbyCuZMo7m9t71m0d9fxlOccyeCRTrixdMQrK/mFEyVL4HXNEWZ49MngVjSKmkod+e54pkAgSeAGcMIhN0ZWXRg505LpStU5x4MnOvQZtDuY1kJiXEi3g/eR00Il05mAk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1679493423136908.9482176211176; Wed, 22 Mar 2023 06:57:03 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.513470.794508 (Exim 4.92) (envelope-from ) id 1peyx6-0003SK-Pd; Wed, 22 Mar 2023 13:56:32 +0000 Received: by outflank-mailman (output) from mailman id 513470.794508; Wed, 22 Mar 2023 13:56:32 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1peyx6-0003SD-Lv; Wed, 22 Mar 2023 13:56:32 +0000 Received: by outflank-mailman (input) for mailman id 513470; Wed, 22 Mar 2023 13:56:31 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1peyx4-0003Ro-OB for xen-devel@lists.xenproject.org; Wed, 22 Mar 2023 13:56:31 +0000 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 564a2f88-c8b9-11ed-85db-49a42c6b2330; Wed, 22 Mar 2023 14:56:27 +0100 (CET) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-28-GRhCHvTpPwOySiq_XJ8zBQ-1; Wed, 22 Mar 2023 09:56:23 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 3FA66800B23; Wed, 22 Mar 2023 13:56:22 +0000 (UTC) Received: from warthog.procyon.org.uk (unknown [10.33.36.18]) by smtp.corp.redhat.com (Postfix) with ESMTP id 541871731B; Wed, 22 Mar 2023 13:56:18 +0000 (UTC) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 564a2f88-c8b9-11ed-85db-49a42c6b2330 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1679493385; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QtS3YWGo7RY6tVsuPyos429cdA5Trk9Ko9ArMj/GbFM=; b=fK7uP+IMVHNflnKM3bx/XPU4DPn1ACpszToPqKW3L3rGZjWIXQocNoFpUtMD8kIw0DR2rh MOKXgEA65hG0LXZs4FihyZoer0wYOKj9waA/IYWX0voNyNPo4Q2swxWO6onkDTkPuLrBEY nnoCMb6sATReh6isozQhKuWAsq5ERSQ= X-MC-Unique: GRhCHvTpPwOySiq_XJ8zBQ-1 From: David Howells To: Willem de Bruijn Cc: David Howells , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Matthew Wilcox , Jeff Layton , Linus Torvalds , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, apparmor@lists.ubuntu.com, bpf@vger.kernel.org, dccp@vger.kernel.org, kvm@vger.kernel.org, linux-afs@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-bluetooth@vger.kernel.org, linux-can@vger.kernel.org, linux-crypto@vger.kernel.org, linux-hams@vger.kernel.org, linux-rdma@vger.kernel.org, linux-s390@vger.kernel.org, linux-sctp@vger.kernel.org, linux-security-module@vger.kernel.org, linux-wpan@vger.kernel.org, linux-x25@vger.kernel.org, mptcp@lists.linux.dev, rds-devel@oss.oracle.com, selinux@vger.kernel.org, tipc-discussion@lists.sourceforge.net, virtualization@lists.linux-foundation.org, xen-devel@lists.xenproject.org Subject: [RFC PATCH 1/3] net: Drop the size argument from ->sendmsg() Date: Wed, 22 Mar 2023 13:56:10 +0000 Message-Id: <20230322135612.3265850-2-dhowells@redhat.com> In-Reply-To: <20230322135612.3265850-1-dhowells@redhat.com> References: <6419bda5a2b4d_59e87208ca@willemb.c.googlers.com.notmuch> <20230322135612.3265850-1-dhowells@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.5 X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1679493425257100001 Content-Type: text/plain; charset="utf-8" The size argument to ->sendmsg() ought to be redundant as the same information should be conveyed by msg->msg_iter.count as returned by msg_data_left(). Signed-off-by: David Howells cc: Eric Dumazet cc: "David S. Miller" cc: Jakub Kicinski cc: Paolo Abeni cc: netdev@vger.kernel.org cc: apparmor@lists.ubuntu.com cc: bpf@vger.kernel.org cc: dccp@vger.kernel.org cc: kvm@vger.kernel.org cc: linux-afs@lists.infradead.org cc: linux-arm-msm@vger.kernel.org cc: linux-bluetooth@vger.kernel.org cc: linux-can@vger.kernel.org cc: linux-crypto@vger.kernel.org cc: linux-hams@vger.kernel.org cc: linux-rdma@vger.kernel.org cc: linux-s390@vger.kernel.org cc: linux-sctp@vger.kernel.org cc: linux-security-module@vger.kernel.org cc: linux-wpan@vger.kernel.org cc: linux-x25@vger.kernel.org cc: mptcp@lists.linux.dev cc: rds-devel@oss.oracle.com cc: selinux@vger.kernel.org cc: tipc-discussion@lists.sourceforge.net cc: virtualization@lists.linux-foundation.org cc: xen-devel@lists.xenproject.org --- crypto/af_alg.c | 12 +++---- crypto/algif_aead.c | 9 +++-- crypto/algif_hash.c | 8 ++--- crypto/algif_rng.c | 3 +- crypto/algif_skcipher.c | 10 +++--- drivers/isdn/mISDN/socket.c | 3 +- .../chelsio/inline_crypto/chtls/chtls.h | 2 +- .../chelsio/inline_crypto/chtls/chtls_io.c | 15 ++++---- drivers/net/ppp/pppoe.c | 4 +-- drivers/net/tap.c | 3 +- drivers/net/tun.c | 3 +- drivers/vhost/net.c | 6 ++-- drivers/xen/pvcalls-back.c | 2 +- drivers/xen/pvcalls-front.c | 4 +-- drivers/xen/pvcalls-front.h | 3 +- fs/afs/rxrpc.c | 8 ++--- include/crypto/if_alg.h | 3 +- include/linux/lsm_hook_defs.h | 3 +- include/linux/lsm_hooks.h | 1 - include/linux/net.h | 6 ++-- include/linux/security.h | 4 +-- include/net/af_rxrpc.h | 3 +- include/net/inet_common.h | 2 +- include/net/ipv6.h | 2 +- include/net/ping.h | 2 +- include/net/sock.h | 7 ++-- include/net/tcp.h | 8 ++--- include/net/udp.h | 2 +- net/appletalk/ddp.c | 3 +- net/atm/common.c | 3 +- net/atm/common.h | 2 +- net/ax25/af_ax25.c | 4 +-- net/bluetooth/hci_sock.c | 4 +-- net/bluetooth/iso.c | 4 +-- net/bluetooth/l2cap_sock.c | 5 ++- net/bluetooth/rfcomm/sock.c | 7 ++-- net/bluetooth/sco.c | 4 +-- net/caif/caif_socket.c | 13 +++---- net/can/bcm.c | 3 +- net/can/isotp.c | 3 +- net/can/j1939/socket.c | 4 +-- net/can/raw.c | 3 +- net/core/sock.c | 4 +-- net/dccp/dccp.h | 2 +- net/dccp/proto.c | 3 +- net/ieee802154/socket.c | 11 +++--- net/ipv4/af_inet.c | 4 +-- net/ipv4/ping.c | 8 +++-- net/ipv4/raw.c | 3 +- net/ipv4/tcp.c | 17 +++++----- net/ipv4/tcp_bpf.c | 5 +-- net/ipv4/tcp_input.c | 3 +- net/ipv4/udp.c | 5 +-- net/ipv6/af_inet6.c | 7 ++-- net/ipv6/ping.c | 5 +-- net/ipv6/raw.c | 3 +- net/ipv6/udp.c | 7 ++-- net/ipv6/udp_impl.h | 2 +- net/iucv/af_iucv.c | 4 +-- net/kcm/kcmsock.c | 2 +- net/key/af_key.c | 3 +- net/l2tp/l2tp_ip.c | 3 +- net/l2tp/l2tp_ip6.c | 3 +- net/l2tp/l2tp_ppp.c | 4 +-- net/llc/af_llc.c | 5 ++- net/mctp/af_mctp.c | 3 +- net/mptcp/protocol.c | 8 ++--- net/netlink/af_netlink.c | 11 +++--- net/netrom/af_netrom.c | 3 +- net/nfc/llcp_sock.c | 7 ++-- net/nfc/rawsock.c | 3 +- net/packet/af_packet.c | 11 +++--- net/phonet/datagram.c | 3 +- net/phonet/pep.c | 3 +- net/phonet/socket.c | 5 ++- net/qrtr/af_qrtr.c | 4 +-- net/rds/rds.h | 2 +- net/rds/send.c | 3 +- net/rose/af_rose.c | 3 +- net/rxrpc/af_rxrpc.c | 6 ++-- net/rxrpc/ar-internal.h | 2 +- net/rxrpc/output.c | 22 ++++++------ net/rxrpc/rxperf.c | 4 +-- net/rxrpc/sendmsg.c | 15 ++++---- net/sctp/socket.c | 3 +- net/smc/af_smc.c | 5 +-- net/socket.c | 16 ++++----- net/tipc/socket.c | 34 +++++++++---------- net/tls/tls.h | 4 +-- net/tls/tls_device.c | 5 +-- net/tls/tls_sw.c | 2 +- net/unix/af_unix.c | 19 +++++------ net/vmw_vsock/af_vsock.c | 16 ++++----- net/x25/af_x25.c | 3 +- net/xdp/xsk.c | 6 ++-- net/xfrm/espintcp.c | 8 +++-- security/apparmor/lsm.c | 6 ++-- security/security.c | 4 +-- security/selinux/hooks.c | 3 +- security/smack/smack_lsm.c | 4 +-- security/tomoyo/common.h | 3 +- security/tomoyo/network.c | 4 +-- security/tomoyo/tomoyo.c | 6 ++-- 103 files changed, 286 insertions(+), 296 deletions(-) diff --git a/crypto/af_alg.c b/crypto/af_alg.c index 5f7252a5b7b4..dc49b4e2d719 100644 --- a/crypto/af_alg.c +++ b/crypto/af_alg.c @@ -952,19 +952,18 @@ static void af_alg_data_wakeup(struct sock *sk) * * @sock: socket of connection to user space * @msg: message from user space - * @size: size of message from user space * @ivsize: the size of the IV for the cipher operation to verify that the * user-space-provided IV has the right size * Return: the number of copied data upon success, < 0 upon error */ -int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, size_t size, - unsigned int ivsize) +int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, unsigned int i= vsize) { struct sock *sk =3D sock->sk; struct alg_sock *ask =3D alg_sk(sk); struct af_alg_ctx *ctx =3D ask->private; struct af_alg_tsgl *sgl; struct af_alg_control con =3D {}; + size_t len; long copied =3D 0; bool enc =3D false; bool init =3D false; @@ -1012,9 +1011,8 @@ int af_alg_sendmsg(struct socket *sock, struct msghdr= *msg, size_t size, ctx->aead_assoclen =3D con.aead_assoclen; } =20 - while (size) { + while ((len =3D msg_data_left(msg))) { struct scatterlist *sg; - size_t len =3D size; size_t plen; =20 /* use the existing memory in an allocated page */ @@ -1037,7 +1035,6 @@ int af_alg_sendmsg(struct socket *sock, struct msghdr= *msg, size_t size, =20 ctx->used +=3D len; copied +=3D len; - size -=3D len; continue; } =20 @@ -1086,11 +1083,10 @@ int af_alg_sendmsg(struct socket *sock, struct msgh= dr *msg, size_t size, len -=3D plen; ctx->used +=3D plen; copied +=3D plen; - size -=3D plen; sgl->cur++; } while (len && sgl->cur < MAX_SGL_ENTS); =20 - if (!size) + if (!msg_data_left(msg)) sg_mark_end(sg + sgl->cur - 1); =20 ctx->merge =3D plen & (PAGE_SIZE - 1); diff --git a/crypto/algif_aead.c b/crypto/algif_aead.c index 42493b4d8ce4..1005c755c4c8 100644 --- a/crypto/algif_aead.c +++ b/crypto/algif_aead.c @@ -58,7 +58,7 @@ static inline bool aead_sufficient_data(struct sock *sk) return ctx->used >=3D ctx->aead_assoclen + (ctx->enc ? 0 : as); } =20 -static int aead_sendmsg(struct socket *sock, struct msghdr *msg, size_t si= ze) +static int aead_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct alg_sock *ask =3D alg_sk(sk); @@ -68,7 +68,7 @@ static int aead_sendmsg(struct socket *sock, struct msghd= r *msg, size_t size) struct crypto_aead *tfm =3D aeadc->aead; unsigned int ivsize =3D crypto_aead_ivsize(tfm); =20 - return af_alg_sendmsg(sock, msg, size, ivsize); + return af_alg_sendmsg(sock, msg, ivsize); } =20 static int crypto_aead_copy_sgl(struct crypto_sync_skcipher *null_tfm, @@ -408,8 +408,7 @@ static int aead_check_key(struct socket *sock) return err; } =20 -static int aead_sendmsg_nokey(struct socket *sock, struct msghdr *msg, - size_t size) +static int aead_sendmsg_nokey(struct socket *sock, struct msghdr *msg) { int err; =20 @@ -417,7 +416,7 @@ static int aead_sendmsg_nokey(struct socket *sock, stru= ct msghdr *msg, if (err) return err; =20 - return aead_sendmsg(sock, msg, size); + return aead_sendmsg(sock, msg); } =20 static ssize_t aead_sendpage_nokey(struct socket *sock, struct page *page, diff --git a/crypto/algif_hash.c b/crypto/algif_hash.c index 1d017ec5c63c..9817adecdf1a 100644 --- a/crypto/algif_hash.c +++ b/crypto/algif_hash.c @@ -60,8 +60,7 @@ static void hash_free_result(struct sock *sk, struct hash= _ctx *ctx) ctx->result =3D NULL; } =20 -static int hash_sendmsg(struct socket *sock, struct msghdr *msg, - size_t ignored) +static int hash_sendmsg(struct socket *sock, struct msghdr *msg) { int limit =3D ALG_MAX_PAGES * PAGE_SIZE; struct sock *sk =3D sock->sk; @@ -325,8 +324,7 @@ static int hash_check_key(struct socket *sock) return err; } =20 -static int hash_sendmsg_nokey(struct socket *sock, struct msghdr *msg, - size_t size) +static int hash_sendmsg_nokey(struct socket *sock, struct msghdr *msg) { int err; =20 @@ -334,7 +332,7 @@ static int hash_sendmsg_nokey(struct socket *sock, stru= ct msghdr *msg, if (err) return err; =20 - return hash_sendmsg(sock, msg, size); + return hash_sendmsg(sock, msg); } =20 static ssize_t hash_sendpage_nokey(struct socket *sock, struct page *page, diff --git a/crypto/algif_rng.c b/crypto/algif_rng.c index 407408c43730..f838be6c2fd7 100644 --- a/crypto/algif_rng.c +++ b/crypto/algif_rng.c @@ -130,11 +130,12 @@ static int rng_test_recvmsg(struct socket *sock, stru= ct msghdr *msg, size_t len, return ret; } =20 -static int rng_test_sendmsg(struct socket *sock, struct msghdr *msg, size_= t len) +static int rng_test_sendmsg(struct socket *sock, struct msghdr *msg) { int err; struct alg_sock *ask =3D alg_sk(sock->sk); struct rng_ctx *ctx =3D ask->private; + size_t len =3D msg_data_left(msg); =20 lock_sock(sock->sk); if (len > MAXSIZE) { diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c index ee8890ee8f33..f5cd9dbbad1b 100644 --- a/crypto/algif_skcipher.c +++ b/crypto/algif_skcipher.c @@ -34,8 +34,7 @@ #include #include =20 -static int skcipher_sendmsg(struct socket *sock, struct msghdr *msg, - size_t size) +static int skcipher_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct alg_sock *ask =3D alg_sk(sk); @@ -44,7 +43,7 @@ static int skcipher_sendmsg(struct socket *sock, struct m= sghdr *msg, struct crypto_skcipher *tfm =3D pask->private; unsigned ivsize =3D crypto_skcipher_ivsize(tfm); =20 - return af_alg_sendmsg(sock, msg, size, ivsize); + return af_alg_sendmsg(sock, msg, ivsize); } =20 static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg, @@ -234,8 +233,7 @@ static int skcipher_check_key(struct socket *sock) return err; } =20 -static int skcipher_sendmsg_nokey(struct socket *sock, struct msghdr *msg, - size_t size) +static int skcipher_sendmsg_nokey(struct socket *sock, struct msghdr *msg) { int err; =20 @@ -243,7 +241,7 @@ static int skcipher_sendmsg_nokey(struct socket *sock, = struct msghdr *msg, if (err) return err; =20 - return skcipher_sendmsg(sock, msg, size); + return skcipher_sendmsg(sock, msg); } =20 static ssize_t skcipher_sendpage_nokey(struct socket *sock, struct page *p= age, diff --git a/drivers/isdn/mISDN/socket.c b/drivers/isdn/mISDN/socket.c index 2776ca5fc33f..4c42d39e994a 100644 --- a/drivers/isdn/mISDN/socket.c +++ b/drivers/isdn/mISDN/socket.c @@ -164,10 +164,11 @@ mISDN_sock_recvmsg(struct socket *sock, struct msghdr= *msg, size_t len, } =20 static int -mISDN_sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) +mISDN_sock_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct sk_buff *skb; + size_t len =3D msg_data_left(msg); int err =3D -ENOMEM; =20 if (*debug & DEBUG_SOCKET) diff --git a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls.h b/dri= vers/net/ethernet/chelsio/inline_crypto/chtls/chtls.h index 41714203ace8..32077c61273b 100644 --- a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls.h +++ b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls.h @@ -565,7 +565,7 @@ void chtls_close(struct sock *sk, long timeout); int chtls_disconnect(struct sock *sk, int flags); void chtls_shutdown(struct sock *sk, int how); void chtls_destroy_sock(struct sock *sk); -int chtls_sendmsg(struct sock *sk, struct msghdr *msg, size_t size); +int chtls_sendmsg(struct sock *sk, struct msghdr *msg); int chtls_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags, int *addr_len); int chtls_sendpage(struct sock *sk, struct page *page, diff --git a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_io.c b/= drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_io.c index ae6b17b96bf1..5782267618cf 100644 --- a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_io.c +++ b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_io.c @@ -1004,7 +1004,7 @@ static int chtls_proccess_cmsg(struct sock *sk, struc= t msghdr *msg, return rc; } =20 -int chtls_sendmsg(struct sock *sk, struct msghdr *msg, size_t size) +int chtls_sendmsg(struct sock *sk, struct msghdr *msg) { struct chtls_sock *csk =3D rcu_dereference_sk_user_data(sk); struct chtls_dev *cdev =3D csk->cdev; @@ -1058,7 +1058,7 @@ int chtls_sendmsg(struct sock *sk, struct msghdr *msg= , size_t size) tx_skb_finalize(skb); } =20 - recordsz =3D size; + recordsz =3D msg_data_left(msg); csk->tlshws.txleft =3D recordsz; csk->tlshws.type =3D record_type; } @@ -1080,8 +1080,8 @@ int chtls_sendmsg(struct sock *sk, struct msghdr *msg= , size_t size) false); } else { skb =3D get_tx_skb(sk, - select_size(sk, size, flags, - TX_HEADER_LEN)); + select_size(sk, msg_data_left(msg), + flags, TX_HEADER_LEN)); } if (unlikely(!skb)) goto wait_for_memory; @@ -1089,8 +1089,8 @@ int chtls_sendmsg(struct sock *sk, struct msghdr *msg= , size_t size) skb->ip_summed =3D CHECKSUM_UNNECESSARY; copy =3D mss; } - if (copy > size) - copy =3D size; + if (copy > msg_data_left(msg)) + copy =3D msg_data_left(msg); =20 if (skb_tailroom(skb) > 0) { copy =3D min(copy, skb_tailroom(skb)); @@ -1182,7 +1182,6 @@ int chtls_sendmsg(struct sock *sk, struct msghdr *msg= , size_t size) tx_skb_finalize(skb); tp->write_seq +=3D copy; copied +=3D copy; - size -=3D copy; =20 if (is_tls_tx(csk)) csk->tlshws.txleft -=3D copy; @@ -1191,7 +1190,7 @@ int chtls_sendmsg(struct sock *sk, struct msghdr *msg= , size_t size) (sk_stream_wspace(sk) < sk_stream_min_wspace(sk))) ULP_SKB_CB(skb)->flags |=3D ULPCB_FLAG_NO_APPEND; =20 - if (size =3D=3D 0) + if (msg_data_left(msg) =3D=3D 0) goto out; =20 if (ULP_SKB_CB(skb)->flags & ULPCB_FLAG_NO_APPEND) diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c index ce2cbb5903d7..7ae28a1f528a 100644 --- a/drivers/net/ppp/pppoe.c +++ b/drivers/net/ppp/pppoe.c @@ -833,8 +833,7 @@ static int pppoe_ioctl(struct socket *sock, unsigned in= t cmd, return err; } =20 -static int pppoe_sendmsg(struct socket *sock, struct msghdr *m, - size_t total_len) +static int pppoe_sendmsg(struct socket *sock, struct msghdr *m) { struct sk_buff *skb; struct sock *sk =3D sock->sk; @@ -843,6 +842,7 @@ static int pppoe_sendmsg(struct socket *sock, struct ms= ghdr *m, struct pppoe_hdr hdr; struct pppoe_hdr *ph; struct net_device *dev; + size_t total_len =3D msg_data_left(m); char *start; int hlen; =20 diff --git a/drivers/net/tap.c b/drivers/net/tap.c index ce993cc75bf3..2b076d4a1a58 100644 --- a/drivers/net/tap.c +++ b/drivers/net/tap.c @@ -1224,8 +1224,7 @@ static int tap_get_user_xdp(struct tap_queue *q, stru= ct xdp_buff *xdp) return err; } =20 -static int tap_sendmsg(struct socket *sock, struct msghdr *m, - size_t total_len) +static int tap_sendmsg(struct socket *sock, struct msghdr *m) { struct tap_queue *q =3D container_of(sock, struct tap_queue, sock); struct tun_msg_ctl *ctl =3D m->msg_control; diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 4c7f74904c25..b31d696adafd 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -2531,13 +2531,14 @@ static int tun_xdp_one(struct tun_struct *tun, return ret; } =20 -static int tun_sendmsg(struct socket *sock, struct msghdr *m, size_t total= _len) +static int tun_sendmsg(struct socket *sock, struct msghdr *m) { int ret, i; struct tun_file *tfile =3D container_of(sock, struct tun_file, socket); struct tun_struct *tun =3D tun_get(tfile); struct tun_msg_ctl *ctl =3D m->msg_control; struct xdp_buff *xdp; + size_t total_len =3D msg_data_left(m); =20 if (!tun) return -EBADFD; diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index 07181cd8d52e..ddf01a21f208 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c @@ -476,7 +476,7 @@ static void vhost_tx_batch(struct vhost_net *net, =20 msghdr->msg_control =3D &ctl; msghdr->msg_controllen =3D sizeof(ctl); - err =3D sock->ops->sendmsg(sock, msghdr, 0); + err =3D sock->ops->sendmsg(sock, msghdr); if (unlikely(err < 0)) { vq_err(&nvq->vq, "Fail to batch sending packets\n"); =20 @@ -836,7 +836,7 @@ static void handle_tx_copy(struct vhost_net *net, struc= t socket *sock) msg.msg_flags &=3D ~MSG_MORE; } =20 - err =3D sock->ops->sendmsg(sock, &msg, len); + err =3D sock->ops->sendmsg(sock, &msg); if (unlikely(err < 0)) { if (err =3D=3D -EAGAIN || err =3D=3D -ENOMEM || err =3D=3D -ENOBUFS) { vhost_discard_vq_desc(vq, 1); @@ -933,7 +933,7 @@ static void handle_tx_zerocopy(struct vhost_net *net, s= truct socket *sock) msg.msg_flags &=3D ~MSG_MORE; } =20 - err =3D sock->ops->sendmsg(sock, &msg, len); + err =3D sock->ops->sendmsg(sock, &msg); if (unlikely(err < 0)) { if (zcopy_used) { if (vq->heads[ubuf->desc].len =3D=3D VHOST_DMA_IN_PROGRESS) diff --git a/drivers/xen/pvcalls-back.c b/drivers/xen/pvcalls-back.c index 1f5219e12cc3..37cfd15b6d9d 100644 --- a/drivers/xen/pvcalls-back.c +++ b/drivers/xen/pvcalls-back.c @@ -200,7 +200,7 @@ static bool pvcalls_conn_back_write(struct sock_mapping= *map) iov_iter_kvec(&msg.msg_iter, ITER_SOURCE, vec, 2, size); } =20 - ret =3D inet_sendmsg(map->sock, &msg, size); + ret =3D inet_sendmsg(map->sock, &msg); if (ret =3D=3D -EAGAIN) { atomic_inc(&map->write); atomic_inc(&map->io); diff --git a/drivers/xen/pvcalls-front.c b/drivers/xen/pvcalls-front.c index d5d589bda243..257d92612371 100644 --- a/drivers/xen/pvcalls-front.c +++ b/drivers/xen/pvcalls-front.c @@ -531,10 +531,10 @@ static int __write_ring(struct pvcalls_data_intf *int= f, return len; } =20 -int pvcalls_front_sendmsg(struct socket *sock, struct msghdr *msg, - size_t len) +int pvcalls_front_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock_mapping *map; + size_t len =3D msg_data_left(msg); int sent, tot_sent =3D 0; int count =3D 0, flags; =20 diff --git a/drivers/xen/pvcalls-front.h b/drivers/xen/pvcalls-front.h index f694ad77379f..f0c5429604e6 100644 --- a/drivers/xen/pvcalls-front.h +++ b/drivers/xen/pvcalls-front.h @@ -14,8 +14,7 @@ int pvcalls_front_accept(struct socket *sock, struct socket *newsock, int flags); int pvcalls_front_sendmsg(struct socket *sock, - struct msghdr *msg, - size_t len); + struct msghdr *msg); int pvcalls_front_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, diff --git a/fs/afs/rxrpc.c b/fs/afs/rxrpc.c index 7817e2b860e5..95ef04862025 100644 --- a/fs/afs/rxrpc.c +++ b/fs/afs/rxrpc.c @@ -367,8 +367,7 @@ void afs_make_call(struct afs_addr_cursor *ac, struct a= fs_call *call, gfp_t gfp) msg.msg_flags =3D MSG_WAITALL | (call->write_iter ? MSG_MORE : 0); =20 ret =3D rxrpc_kernel_send_data(call->net->socket, rxcall, - &msg, call->request_size, - afs_notify_end_request_tx); + &msg, afs_notify_end_request_tx); if (ret < 0) goto error_do_abort; =20 @@ -379,7 +378,6 @@ void afs_make_call(struct afs_addr_cursor *ac, struct a= fs_call *call, gfp_t gfp) =20 ret =3D rxrpc_kernel_send_data(call->net->socket, call->rxcall, &msg, - iov_iter_count(&msg.msg_iter), afs_notify_end_request_tx); *call->write_iter =3D msg.msg_iter; =20 @@ -834,7 +832,7 @@ void afs_send_empty_reply(struct afs_call *call) msg.msg_controllen =3D 0; msg.msg_flags =3D 0; =20 - switch (rxrpc_kernel_send_data(net->socket, call->rxcall, &msg, 0, + switch (rxrpc_kernel_send_data(net->socket, call->rxcall, &msg, afs_notify_end_reply_tx)) { case 0: _leave(" [replied]"); @@ -875,7 +873,7 @@ void afs_send_simple_reply(struct afs_call *call, const= void *buf, size_t len) msg.msg_controllen =3D 0; msg.msg_flags =3D 0; =20 - n =3D rxrpc_kernel_send_data(net->socket, call->rxcall, &msg, len, + n =3D rxrpc_kernel_send_data(net->socket, call->rxcall, &msg, afs_notify_end_reply_tx); if (n >=3D 0) { /* Success */ diff --git a/include/crypto/if_alg.h b/include/crypto/if_alg.h index 7e76623f9ec3..bcf0077aae6d 100644 --- a/include/crypto/if_alg.h +++ b/include/crypto/if_alg.h @@ -228,8 +228,7 @@ void af_alg_pull_tsgl(struct sock *sk, size_t used, str= uct scatterlist *dst, size_t dst_offset); void af_alg_wmem_wakeup(struct sock *sk); int af_alg_wait_for_data(struct sock *sk, unsigned flags, unsigned min); -int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, size_t size, - unsigned int ivsize); +int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, unsigned int i= vsize); ssize_t af_alg_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags); void af_alg_free_resources(struct af_alg_async_req *areq); diff --git a/include/linux/lsm_hook_defs.h b/include/linux/lsm_hook_defs.h index 094b76dc7164..b176525025da 100644 --- a/include/linux/lsm_hook_defs.h +++ b/include/linux/lsm_hook_defs.h @@ -298,8 +298,7 @@ LSM_HOOK(int, 0, socket_connect, struct socket *sock, s= truct sockaddr *address, int addrlen) LSM_HOOK(int, 0, socket_listen, struct socket *sock, int backlog) LSM_HOOK(int, 0, socket_accept, struct socket *sock, struct socket *newsoc= k) -LSM_HOOK(int, 0, socket_sendmsg, struct socket *sock, struct msghdr *msg, - int size) +LSM_HOOK(int, 0, socket_sendmsg, struct socket *sock, struct msghdr *msg) LSM_HOOK(int, 0, socket_recvmsg, struct socket *sock, struct msghdr *msg, int size, int flags) LSM_HOOK(int, 0, socket_getsockname, struct socket *sock) diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h index 6e156d2acffc..6f48be80b6bf 100644 --- a/include/linux/lsm_hooks.h +++ b/include/linux/lsm_hooks.h @@ -932,7 +932,6 @@ * Check permission before transmitting a message to another socket. * @sock contains the socket structure. * @msg contains the message to be transmitted. - * @size contains the size of message. * Return 0 if permission is granted. * @socket_recvmsg: * Check permission before receiving a message from a socket. diff --git a/include/linux/net.h b/include/linux/net.h index b73ad8e3c212..8adf1328445a 100644 --- a/include/linux/net.h +++ b/include/linux/net.h @@ -192,8 +192,7 @@ struct proto_ops { int (*getsockopt)(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen); void (*show_fdinfo)(struct seq_file *m, struct socket *sock); - int (*sendmsg) (struct socket *sock, struct msghdr *m, - size_t total_len); + int (*sendmsg) (struct socket *sock, struct msghdr *m); /* Notes for implementing recvmsg: * =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D * msg->msg_namelen should get updated by the recvmsg handlers @@ -222,8 +221,7 @@ struct proto_ops { int (*read_skb)(struct sock *sk, skb_read_actor_t recv_actor); int (*sendpage_locked)(struct sock *sk, struct page *page, int offset, size_t size, int flags); - int (*sendmsg_locked)(struct sock *sk, struct msghdr *msg, - size_t size); + int (*sendmsg_locked)(struct sock *sk, struct msghdr *msg); int (*set_rcvlowat)(struct sock *sk, int val); }; =20 diff --git a/include/linux/security.h b/include/linux/security.h index 5984d0d550b4..6c67a4de4a89 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -1436,7 +1436,7 @@ int security_socket_bind(struct socket *sock, struct = sockaddr *address, int addr int security_socket_connect(struct socket *sock, struct sockaddr *address,= int addrlen); int security_socket_listen(struct socket *sock, int backlog); int security_socket_accept(struct socket *sock, struct socket *newsock); -int security_socket_sendmsg(struct socket *sock, struct msghdr *msg, int s= ize); +int security_socket_sendmsg(struct socket *sock, struct msghdr *msg); int security_socket_recvmsg(struct socket *sock, struct msghdr *msg, int size, int flags); int security_socket_getsockname(struct socket *sock); @@ -1538,7 +1538,7 @@ static inline int security_socket_accept(struct socke= t *sock, } =20 static inline int security_socket_sendmsg(struct socket *sock, - struct msghdr *msg, int size) + struct msghdr *msg) { return 0; } diff --git a/include/net/af_rxrpc.h b/include/net/af_rxrpc.h index ba717eac0229..33f1b8c622e3 100644 --- a/include/net/af_rxrpc.h +++ b/include/net/af_rxrpc.h @@ -51,8 +51,7 @@ struct rxrpc_call *rxrpc_kernel_begin_call(struct socket = *, enum rxrpc_interruptibility, unsigned int); int rxrpc_kernel_send_data(struct socket *, struct rxrpc_call *, - struct msghdr *, size_t, - rxrpc_notify_end_tx_t); + struct msghdr *, rxrpc_notify_end_tx_t); int rxrpc_kernel_recv_data(struct socket *, struct rxrpc_call *, struct iov_iter *, size_t *, bool, u32 *, u16 *); bool rxrpc_kernel_abort_call(struct socket *, struct rxrpc_call *, diff --git a/include/net/inet_common.h b/include/net/inet_common.h index cec453c18f1d..ec798fdd371c 100644 --- a/include/net/inet_common.h +++ b/include/net/inet_common.h @@ -32,7 +32,7 @@ int inet_dgram_connect(struct socket *sock, struct sockad= dr *uaddr, int inet_accept(struct socket *sock, struct socket *newsock, int flags, bool kern); int inet_send_prepare(struct sock *sk); -int inet_sendmsg(struct socket *sock, struct msghdr *msg, size_t size); +int inet_sendmsg(struct socket *sock, struct msghdr *msg); ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags); int inet_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 7332296eca44..f2132311e92b 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h @@ -1228,7 +1228,7 @@ int inet6_compat_ioctl(struct socket *sock, unsigned = int cmd, =20 int inet6_hash_connect(struct inet_timewait_death_row *death_row, struct sock *sk); -int inet6_sendmsg(struct socket *sock, struct msghdr *msg, size_t size); +int inet6_sendmsg(struct socket *sock, struct msghdr *msg); int inet6_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, int flags); =20 diff --git a/include/net/ping.h b/include/net/ping.h index 9233ad3de0ad..04814edde8e3 100644 --- a/include/net/ping.h +++ b/include/net/ping.h @@ -70,7 +70,7 @@ int ping_getfrag(void *from, char *to, int offset, int f= raglen, int odd, =20 int ping_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags, int *addr_len); -int ping_common_sendmsg(int family, struct msghdr *msg, size_t len, +int ping_common_sendmsg(int family, struct msghdr *msg, void *user_icmph, size_t icmph_len); int ping_queue_rcv_skb(struct sock *sk, struct sk_buff *skb); enum skb_drop_reason ping_rcv(struct sk_buff *skb); diff --git a/include/net/sock.h b/include/net/sock.h index 573f2bf7e0de..7a6d06c181b6 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -1261,8 +1261,7 @@ struct proto { int (*compat_ioctl)(struct sock *sk, unsigned int cmd, unsigned long arg); #endif - int (*sendmsg)(struct sock *sk, struct msghdr *msg, - size_t len); + int (*sendmsg)(struct sock *sk, struct msghdr *msg); int (*recvmsg)(struct sock *sk, struct msghdr *msg, size_t len, int flags, int *addr_len); int (*sendpage)(struct sock *sk, struct page *page, @@ -1901,8 +1900,8 @@ int sock_no_getname(struct socket *, struct sockaddr = *, int); int sock_no_ioctl(struct socket *, unsigned int, unsigned long); int sock_no_listen(struct socket *, int); int sock_no_shutdown(struct socket *, int); -int sock_no_sendmsg(struct socket *, struct msghdr *, size_t); -int sock_no_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t len= ); +int sock_no_sendmsg(struct socket *sk, struct msghdr *msg); +int sock_no_sendmsg_locked(struct sock *sk, struct msghdr *msg); int sock_no_recvmsg(struct socket *, struct msghdr *, size_t, int); int sock_no_mmap(struct file *file, struct socket *sock, struct vm_area_struct *vma); diff --git a/include/net/tcp.h b/include/net/tcp.h index a0a91a988272..12b228e3d563 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -325,10 +325,10 @@ int tcp_v4_rcv(struct sk_buff *skb); =20 void tcp_remove_empty_skb(struct sock *sk); int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw); -int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size); -int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size); +int tcp_sendmsg(struct sock *sk, struct msghdr *msg); +int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg); int tcp_sendmsg_fastopen(struct sock *sk, struct msghdr *msg, int *copied, - size_t size, struct ubuf_info *uarg); + struct ubuf_info *uarg); int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t si= ze, int flags); int tcp_sendpage_locked(struct sock *sk, struct page *page, int offset, @@ -479,7 +479,7 @@ struct sk_buff *tcp_make_synack(const struct sock *sk, = struct dst_entry *dst, int tcp_disconnect(struct sock *sk, int flags); =20 void tcp_finish_connect(struct sock *sk, struct sk_buff *skb); -int tcp_send_rcvq(struct sock *sk, struct msghdr *msg, size_t size); +int tcp_send_rcvq(struct sock *sk, struct msghdr *msg); void inet_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb); =20 /* From syncookies.c */ diff --git a/include/net/udp.h b/include/net/udp.h index de4b528522bb..b9b2ea5af42d 100644 --- a/include/net/udp.h +++ b/include/net/udp.h @@ -277,7 +277,7 @@ int udp_get_port(struct sock *sk, unsigned short snum, const struct sock *)); int udp_err(struct sk_buff *, u32); int udp_abort(struct sock *sk, int err); -int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len); +int udp_sendmsg(struct sock *sk, struct msghdr *msg); int udp_push_pending_frames(struct sock *sk); void udp_flush_pending_frames(struct sock *sk); int udp_cmsg_send(struct sock *sk, struct msghdr *msg, u16 *gso_size); diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c index a06f4d4a6f47..70008c57503f 100644 --- a/net/appletalk/ddp.c +++ b/net/appletalk/ddp.c @@ -1566,7 +1566,7 @@ static int ltalk_rcv(struct sk_buff *skb, struct net_= device *dev, return 0; } =20 -static int atalk_sendmsg(struct socket *sock, struct msghdr *msg, size_t l= en) +static int atalk_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct atalk_sock *at =3D at_sk(sk); @@ -1579,6 +1579,7 @@ static int atalk_sendmsg(struct socket *sock, struct = msghdr *msg, size_t len) struct ddpehdr *ddp; int size, hard_header_len; struct atalk_route *rt, *rt_lo =3D NULL; + size_t len =3D msg_data_left(msg); int err; =20 if (flags & ~(MSG_DONTWAIT|MSG_CMSG_COMPAT)) diff --git a/net/atm/common.c b/net/atm/common.c index f7019df41c3e..09060644760b 100644 --- a/net/atm/common.c +++ b/net/atm/common.c @@ -565,12 +565,13 @@ int vcc_recvmsg(struct socket *sock, struct msghdr *m= sg, size_t size, return copied; } =20 -int vcc_sendmsg(struct socket *sock, struct msghdr *m, size_t size) +int vcc_sendmsg(struct socket *sock, struct msghdr *m) { struct sock *sk =3D sock->sk; DEFINE_WAIT(wait); struct atm_vcc *vcc; struct sk_buff *skb; + size_t size =3D msg_data_left(m); int eff, error; =20 lock_sock(sk); diff --git a/net/atm/common.h b/net/atm/common.h index a1e56e8de698..6597f8308f03 100644 --- a/net/atm/common.h +++ b/net/atm/common.h @@ -16,7 +16,7 @@ int vcc_release(struct socket *sock); int vcc_connect(struct socket *sock, int itf, short vpi, int vci); int vcc_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, int flags); -int vcc_sendmsg(struct socket *sock, struct msghdr *m, size_t total_len); +int vcc_sendmsg(struct socket *sock, struct msghdr *m); __poll_t vcc_poll(struct file *file, struct socket *sock, poll_table *wait= ); int vcc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); int vcc_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long = arg); diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c index d8da400cb4de..48f96e28f7ea 100644 --- a/net/ax25/af_ax25.c +++ b/net/ax25/af_ax25.c @@ -1489,7 +1489,7 @@ static int ax25_getname(struct socket *sock, struct s= ockaddr *uaddr, return err; } =20 -static int ax25_sendmsg(struct socket *sock, struct msghdr *msg, size_t le= n) +static int ax25_sendmsg(struct socket *sock, struct msghdr *msg) { DECLARE_SOCKADDR(struct sockaddr_ax25 *, usax, msg->msg_name); struct sock *sk =3D sock->sk; @@ -1497,7 +1497,7 @@ static int ax25_sendmsg(struct socket *sock, struct m= sghdr *msg, size_t len) struct sk_buff *skb; ax25_digi dtmp, *dp; ax25_cb *ax25; - size_t size; + size_t size, len =3D msg_data_left(msg); int lv, err, addr_len =3D msg->msg_namelen; =20 if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_CMSG_COMPAT)) diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index 06581223238c..9d6f713eeac1 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c @@ -1692,8 +1692,7 @@ static int hci_logging_frame(struct sock *sk, struct = sk_buff *skb, return err; } =20 -static int hci_sock_sendmsg(struct socket *sock, struct msghdr *msg, - size_t len) +static int hci_sock_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct hci_mgmt_chan *chan; @@ -1701,6 +1700,7 @@ static int hci_sock_sendmsg(struct socket *sock, stru= ct msghdr *msg, struct sk_buff *skb; int err; const unsigned int flags =3D msg->msg_flags; + size_t len =3D msg_data_left(msg); =20 BT_DBG("sock %p sk %p", sock, sk); =20 diff --git a/net/bluetooth/iso.c b/net/bluetooth/iso.c index 24444b502e58..6d8863878abc 100644 --- a/net/bluetooth/iso.c +++ b/net/bluetooth/iso.c @@ -1031,12 +1031,12 @@ static int iso_sock_getname(struct socket *sock, st= ruct sockaddr *addr, return sizeof(struct sockaddr_iso); } =20 -static int iso_sock_sendmsg(struct socket *sock, struct msghdr *msg, - size_t len) +static int iso_sock_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct iso_conn *conn =3D iso_pi(sk)->conn; struct sk_buff *skb, **frag; + size_t len =3D msg_data_left(msg); int err; =20 BT_DBG("sock %p, sk %p", sock, sk); diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index eebe256104bc..d488aca82037 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c @@ -1143,8 +1143,7 @@ static int l2cap_sock_setsockopt(struct socket *sock,= int level, int optname, return err; } =20 -static int l2cap_sock_sendmsg(struct socket *sock, struct msghdr *msg, - size_t len) +static int l2cap_sock_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct l2cap_chan *chan =3D l2cap_pi(sk)->chan; @@ -1169,7 +1168,7 @@ static int l2cap_sock_sendmsg(struct socket *sock, st= ruct msghdr *msg, return err; =20 l2cap_chan_lock(chan); - err =3D l2cap_chan_send(chan, msg, len); + err =3D l2cap_chan_send(chan, msg, msg_data_left(msg)); l2cap_chan_unlock(chan); =20 return err; diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index 4397e14ff560..8a0a51b5c3a3 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c @@ -558,8 +558,7 @@ static int rfcomm_sock_getname(struct socket *sock, str= uct sockaddr *addr, int p return sizeof(struct sockaddr_rc); } =20 -static int rfcomm_sock_sendmsg(struct socket *sock, struct msghdr *msg, - size_t len) +static int rfcomm_sock_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct rfcomm_dlc *d =3D rfcomm_pi(sk)->dlc; @@ -586,8 +585,8 @@ static int rfcomm_sock_sendmsg(struct socket *sock, str= uct msghdr *msg, if (sent) return sent; =20 - skb =3D bt_skb_sendmmsg(sk, msg, len, d->mtu, RFCOMM_SKB_HEAD_RESERVE, - RFCOMM_SKB_TAIL_RESERVE); + skb =3D bt_skb_sendmmsg(sk, msg, msg_data_left(msg), d->mtu, + RFCOMM_SKB_HEAD_RESERVE, RFCOMM_SKB_TAIL_RESERVE); if (IS_ERR(skb)) return PTR_ERR(skb); =20 diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index 1111da4e2f2b..8c62c5dc5b57 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c @@ -722,11 +722,11 @@ static int sco_sock_getname(struct socket *sock, stru= ct sockaddr *addr, return sizeof(struct sockaddr_sco); } =20 -static int sco_sock_sendmsg(struct socket *sock, struct msghdr *msg, - size_t len) +static int sco_sock_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct sk_buff *skb; + size_t len =3D msg_data_left(msg); int err; =20 BT_DBG("sock %p, sk %p", sock, sk); diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c index 4eebcc66c19a..827230b3f7c3 100644 --- a/net/caif/caif_socket.c +++ b/net/caif/caif_socket.c @@ -510,8 +510,7 @@ static int transmit_skb(struct sk_buff *skb, struct cai= fsock *cf_sk, } =20 /* Copied from af_unix:unix_dgram_sendmsg, and adapted to CAIF */ -static int caif_seqpkt_sendmsg(struct socket *sock, struct msghdr *msg, - size_t len) +static int caif_seqpkt_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct caifsock *cf_sk =3D container_of(sk, struct caifsock, sk); @@ -520,6 +519,8 @@ static int caif_seqpkt_sendmsg(struct socket *sock, str= uct msghdr *msg, struct sk_buff *skb =3D NULL; int noblock; long timeo; + size_t len =3D msg_data_left(msg); + caif_assert(cf_sk); ret =3D sock_error(sk); if (ret) @@ -582,8 +583,7 @@ static int caif_seqpkt_sendmsg(struct socket *sock, str= uct msghdr *msg, * Changed removed permission handling and added waiting for flow on * and other minor adaptations. */ -static int caif_stream_sendmsg(struct socket *sock, struct msghdr *msg, - size_t len) +static int caif_stream_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct caifsock *cf_sk =3D container_of(sk, struct caifsock, sk); @@ -605,10 +605,7 @@ static int caif_stream_sendmsg(struct socket *sock, st= ruct msghdr *msg, if (unlikely(sk->sk_shutdown & SEND_SHUTDOWN)) goto pipe_err; =20 - while (sent < len) { - - size =3D len-sent; - + while ((size =3D msg_data_left(msg))) { if (size > cf_sk->maxframe) size =3D cf_sk->maxframe; =20 diff --git a/net/can/bcm.c b/net/can/bcm.c index 27706f6ace34..9baace5e0d71 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c @@ -1287,12 +1287,13 @@ static int bcm_tx_send(struct msghdr *msg, int ifin= dex, struct sock *sk, /* * bcm_sendmsg - process BCM commands (opcodes) from the userspace */ -static int bcm_sendmsg(struct socket *sock, struct msghdr *msg, size_t siz= e) +static int bcm_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct bcm_sock *bo =3D bcm_sk(sk); int ifindex =3D bo->ifindex; /* default ifindex for this bcm_op */ struct bcm_msg_head msg_head; + size_t size =3D msg_data_left(msg); int cfsiz; int ret; /* read bytes or error codes as return value */ =20 diff --git a/net/can/isotp.c b/net/can/isotp.c index 9bc344851704..6b5d3ebd6748 100644 --- a/net/can/isotp.c +++ b/net/can/isotp.c @@ -914,7 +914,7 @@ static enum hrtimer_restart isotp_txfr_timer_handler(st= ruct hrtimer *hrtimer) return HRTIMER_NORESTART; } =20 -static int isotp_sendmsg(struct socket *sock, struct msghdr *msg, size_t s= ize) +static int isotp_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct isotp_sock *so =3D isotp_sk(sk); @@ -922,6 +922,7 @@ static int isotp_sendmsg(struct socket *sock, struct ms= ghdr *msg, size_t size) struct sk_buff *skb; struct net_device *dev; struct canfd_frame *cf; + size_t size =3D msg_data_left(msg); int ae =3D (so->opt.flags & CAN_ISOTP_EXTEND_ADDR) ? 1 : 0; int wait_tx_done =3D (so->opt.flags & CAN_ISOTP_WAIT_TX_DONE) ? 1 : 0; s64 hrtimer_sec =3D ISOTP_ECHO_TIMEOUT; diff --git a/net/can/j1939/socket.c b/net/can/j1939/socket.c index 7e90f9e61d9b..2b009b69e853 100644 --- a/net/can/j1939/socket.c +++ b/net/can/j1939/socket.c @@ -1187,12 +1187,12 @@ static int j1939_sk_send_loop(struct j1939_priv *pr= iv, struct sock *sk, return ret; } =20 -static int j1939_sk_sendmsg(struct socket *sock, struct msghdr *msg, - size_t size) +static int j1939_sk_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct j1939_sock *jsk =3D j1939_sk(sk); struct j1939_priv *priv; + size_t size =3D msg_data_left(msg); int ifindex; int ret; =20 diff --git a/net/can/raw.c b/net/can/raw.c index f64469b98260..0c37f1c70685 100644 --- a/net/can/raw.c +++ b/net/can/raw.c @@ -814,13 +814,14 @@ static bool raw_bad_txframe(struct raw_sock *ro, stru= ct sk_buff *skb, int mtu) return true; } =20 -static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t siz= e) +static int raw_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct raw_sock *ro =3D raw_sk(sk); struct sockcm_cookie sockc; struct sk_buff *skb; struct net_device *dev; + size_t size =3D msg_data_left(msg); int ifindex; int err =3D -EINVAL; =20 diff --git a/net/core/sock.c b/net/core/sock.c index c25888795390..4170381356aa 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -3183,13 +3183,13 @@ int sock_no_shutdown(struct socket *sock, int how) } EXPORT_SYMBOL(sock_no_shutdown); =20 -int sock_no_sendmsg(struct socket *sock, struct msghdr *m, size_t len) +int sock_no_sendmsg(struct socket *sock, struct msghdr *m) { return -EOPNOTSUPP; } EXPORT_SYMBOL(sock_no_sendmsg); =20 -int sock_no_sendmsg_locked(struct sock *sk, struct msghdr *m, size_t len) +int sock_no_sendmsg_locked(struct sock *sk, struct msghdr *m) { return -EOPNOTSUPP; } diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h index 9ddc3a9e89e4..3d5d7615ddd8 100644 --- a/net/dccp/dccp.h +++ b/net/dccp/dccp.h @@ -293,7 +293,7 @@ int dccp_getsockopt(struct sock *sk, int level, int opt= name, int dccp_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval, unsigned int optlen); int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg); -int dccp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size); +int dccp_sendmsg(struct sock *sk, struct msghdr *msg); int dccp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flag= s, int *addr_len); void dccp_shutdown(struct sock *sk, int how); diff --git a/net/dccp/proto.c b/net/dccp/proto.c index a06b5641287a..6f6623bb1ff8 100644 --- a/net/dccp/proto.c +++ b/net/dccp/proto.c @@ -725,12 +725,13 @@ static int dccp_msghdr_parse(struct msghdr *msg, stru= ct sk_buff *skb) return 0; } =20 -int dccp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) +int dccp_sendmsg(struct sock *sk, struct msghdr *msg) { const struct dccp_sock *dp =3D dccp_sk(sk); const int flags =3D msg->msg_flags; const int noblock =3D flags & MSG_DONTWAIT; struct sk_buff *skb; + size_t len =3D msg_data_left(msg); int rc, size; long timeo; =20 diff --git a/net/ieee802154/socket.c b/net/ieee802154/socket.c index 1fa2fe041ec0..70f2948b7946 100644 --- a/net/ieee802154/socket.c +++ b/net/ieee802154/socket.c @@ -88,12 +88,11 @@ static int ieee802154_sock_release(struct socket *sock) return 0; } =20 -static int ieee802154_sock_sendmsg(struct socket *sock, struct msghdr *msg, - size_t len) +static int ieee802154_sock_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; =20 - return sk->sk_prot->sendmsg(sk, msg, len); + return sk->sk_prot->sendmsg(sk, msg); } =20 static int ieee802154_sock_bind(struct socket *sock, struct sockaddr *uadd= r, @@ -238,11 +237,12 @@ static int raw_disconnect(struct sock *sk, int flags) return 0; } =20 -static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size) +static int raw_sendmsg(struct sock *sk, struct msghdr *msg) { struct net_device *dev; unsigned int mtu; struct sk_buff *skb; + size_t size =3D msg_data_left(msg); int hlen, tlen; int err; =20 @@ -605,7 +605,7 @@ static int dgram_disconnect(struct sock *sk, int flags) return 0; } =20 -static int dgram_sendmsg(struct sock *sk, struct msghdr *msg, size_t size) +static int dgram_sendmsg(struct sock *sk, struct msghdr *msg) { struct net_device *dev; unsigned int mtu; @@ -614,6 +614,7 @@ static int dgram_sendmsg(struct sock *sk, struct msghdr= *msg, size_t size) struct dgram_sock *ro =3D dgram_sk(sk); struct ieee802154_addr dst_addr; DECLARE_SOCKADDR(struct sockaddr_ieee802154*, daddr, msg->msg_name); + size_t size =3D msg_data_left(msg); int hlen, tlen; int err; =20 diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 940062e08f57..4facfef8bded 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -815,7 +815,7 @@ int inet_send_prepare(struct sock *sk) } EXPORT_SYMBOL_GPL(inet_send_prepare); =20 -int inet_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) +int inet_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; =20 @@ -823,7 +823,7 @@ int inet_sendmsg(struct socket *sock, struct msghdr *ms= g, size_t size) return -EAGAIN; =20 return INDIRECT_CALL_2(sk->sk_prot->sendmsg, tcp_sendmsg, udp_sendmsg, - sk, msg, size); + sk, msg); } EXPORT_SYMBOL(inet_sendmsg); =20 diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c index 409ec2a1f95b..f689f9f530c9 100644 --- a/net/ipv4/ping.c +++ b/net/ipv4/ping.c @@ -657,9 +657,10 @@ static int ping_v4_push_pending_frames(struct sock *sk= , struct pingfakehdr *pfh, return ip_push_pending_frames(sk, fl4); } =20 -int ping_common_sendmsg(int family, struct msghdr *msg, size_t len, +int ping_common_sendmsg(int family, struct msghdr *msg, void *user_icmph, size_t icmph_len) { + size_t len =3D msg_data_left(msg); u8 type, code; =20 if (len > 0xFFFF) @@ -703,7 +704,7 @@ int ping_common_sendmsg(int family, struct msghdr *msg,= size_t len, } EXPORT_SYMBOL_GPL(ping_common_sendmsg); =20 -static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) +static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg) { struct net *net =3D sock_net(sk); struct flowi4 fl4; @@ -713,6 +714,7 @@ static int ping_v4_sendmsg(struct sock *sk, struct msgh= dr *msg, size_t len) struct pingfakehdr pfh; struct rtable *rt =3D NULL; struct ip_options_data opt_copy; + size_t len =3D msg_data_left(msg); int free =3D 0; __be32 saddr, daddr, faddr; u8 tos; @@ -720,7 +722,7 @@ static int ping_v4_sendmsg(struct sock *sk, struct msgh= dr *msg, size_t len) =20 pr_debug("ping_v4_sendmsg(sk=3D%p,sk->num=3D%u)\n", inet, inet->inet_num); =20 - err =3D ping_common_sendmsg(AF_INET, msg, len, &user_icmph, + err =3D ping_common_sendmsg(AF_INET, msg, &user_icmph, sizeof(user_icmph)); if (err) return err; diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 3cf68695b40d..f2859c117796 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c @@ -471,7 +471,7 @@ static int raw_getfrag(void *from, char *to, int offset= , int len, int odd, return ip_generic_getfrag(rfv->msg, to, offset, len, odd, skb); } =20 -static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) +static int raw_sendmsg(struct sock *sk, struct msghdr *msg) { struct inet_sock *inet =3D inet_sk(sk); struct net *net =3D sock_net(sk); @@ -485,6 +485,7 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *= msg, size_t len) int err; struct ip_options_data opt_copy; struct raw_frag_vec rfv; + size_t len =3D msg_data_left(msg); int hdrincl; =20 err =3D -EMSGSIZE; diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index fd68d49490f2..2a98b104892c 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -1166,7 +1166,7 @@ void tcp_free_fastopen_req(struct tcp_sock *tp) } =20 int tcp_sendmsg_fastopen(struct sock *sk, struct msghdr *msg, int *copied, - size_t size, struct ubuf_info *uarg) + struct ubuf_info *uarg) { struct tcp_sock *tp =3D tcp_sk(sk); struct inet_sock *inet =3D inet_sk(sk); @@ -1186,7 +1186,7 @@ int tcp_sendmsg_fastopen(struct sock *sk, struct msgh= dr *msg, int *copied, if (unlikely(!tp->fastopen_req)) return -ENOBUFS; tp->fastopen_req->data =3D msg; - tp->fastopen_req->size =3D size; + tp->fastopen_req->size =3D msg_data_left(msg); tp->fastopen_req->uarg =3D uarg; =20 if (inet->defer_connect) { @@ -1212,12 +1212,13 @@ int tcp_sendmsg_fastopen(struct sock *sk, struct ms= ghdr *msg, int *copied, return err; } =20 -int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size) +int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg) { struct tcp_sock *tp =3D tcp_sk(sk); struct ubuf_info *uarg =3D NULL; struct sk_buff *skb; struct sockcm_cookie sockc; + size_t size =3D msg_data_left(msg); int flags, err, copied =3D 0; int mss_now =3D 0, size_goal, copied_syn =3D 0; int process_backlog =3D 0; @@ -1226,7 +1227,7 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr= *msg, size_t size) =20 flags =3D msg->msg_flags; =20 - if ((flags & MSG_ZEROCOPY) && size) { + if ((flags & MSG_ZEROCOPY) && msg_data_left(msg)) { skb =3D tcp_write_queue_tail(sk); =20 if (msg->msg_ubuf) { @@ -1247,7 +1248,7 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr= *msg, size_t size) =20 if (unlikely(flags & MSG_FASTOPEN || inet_sk(sk)->defer_connect) && !tp->repair) { - err =3D tcp_sendmsg_fastopen(sk, msg, &copied_syn, size, uarg); + err =3D tcp_sendmsg_fastopen(sk, msg, &copied_syn, uarg); if (err =3D=3D -EINPROGRESS && copied_syn > 0) goto out; else if (err) @@ -1271,7 +1272,7 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr= *msg, size_t size) =20 if (unlikely(tp->repair)) { if (tp->repair_queue =3D=3D TCP_RECV_QUEUE) { - copied =3D tcp_send_rcvq(sk, msg, size); + copied =3D tcp_send_rcvq(sk, msg); goto out_nopush; } =20 @@ -1477,12 +1478,12 @@ int tcp_sendmsg_locked(struct sock *sk, struct msgh= dr *msg, size_t size) } EXPORT_SYMBOL_GPL(tcp_sendmsg_locked); =20 -int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size) +int tcp_sendmsg(struct sock *sk, struct msghdr *msg) { int ret; =20 lock_sock(sk); - ret =3D tcp_sendmsg_locked(sk, msg, size); + ret =3D tcp_sendmsg_locked(sk, msg); release_sock(sk); =20 return ret; diff --git a/net/ipv4/tcp_bpf.c b/net/ipv4/tcp_bpf.c index ebf917511937..843eb2b6b8d3 100644 --- a/net/ipv4/tcp_bpf.c +++ b/net/ipv4/tcp_bpf.c @@ -396,9 +396,10 @@ static int tcp_bpf_send_verdict(struct sock *sk, struc= t sk_psock *psock, return ret; } =20 -static int tcp_bpf_sendmsg(struct sock *sk, struct msghdr *msg, size_t siz= e) +static int tcp_bpf_sendmsg(struct sock *sk, struct msghdr *msg) { struct sk_msg tmp, *msg_tx =3D NULL; + size_t size =3D msg_data_left(msg); int copied =3D 0, err =3D 0; struct sk_psock *psock; long timeo; @@ -410,7 +411,7 @@ static int tcp_bpf_sendmsg(struct sock *sk, struct msgh= dr *msg, size_t size) =20 psock =3D sk_psock_get(sk); if (unlikely(!psock)) - return tcp_sendmsg(sk, msg, size); + return tcp_sendmsg(sk, msg); =20 lock_sock(sk); timeo =3D sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 2b75cd9e2e92..a1c7d834abca 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -4948,9 +4948,10 @@ static int __must_check tcp_queue_rcv(struct sock *s= k, struct sk_buff *skb, return eaten; } =20 -int tcp_send_rcvq(struct sock *sk, struct msghdr *msg, size_t size) +int tcp_send_rcvq(struct sock *sk, struct msghdr *msg) { struct sk_buff *skb; + size_t size =3D msg_data_left(msg); int err =3D -ENOMEM; int data_len =3D 0; bool fragstolen; diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index aa32afd871ee..b2ed9d37a362 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -1049,13 +1049,14 @@ int udp_cmsg_send(struct sock *sk, struct msghdr *m= sg, u16 *gso_size) } EXPORT_SYMBOL_GPL(udp_cmsg_send); =20 -int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) +int udp_sendmsg(struct sock *sk, struct msghdr *msg) { struct inet_sock *inet =3D inet_sk(sk); struct udp_sock *up =3D udp_sk(sk); DECLARE_SOCKADDR(struct sockaddr_in *, usin, msg->msg_name); struct flowi4 fl4_stack; struct flowi4 *fl4; + unsigned int len =3D msg_data_left(msg); int ulen =3D len; struct ipcm_cookie ipc; struct rtable *rt =3D NULL; @@ -1346,7 +1347,7 @@ int udp_sendpage(struct sock *sk, struct page *page, = int offset, * sendpage interface can't pass. * This will succeed only when the socket is connected. */ - ret =3D udp_sendmsg(sk, &msg, 0); + ret =3D udp_sendmsg(sk, &msg); if (ret < 0) return ret; } diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index e1b679a590c9..d6b4cfc44e2a 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c @@ -636,9 +636,8 @@ int inet6_compat_ioctl(struct socket *sock, unsigned in= t cmd, unsigned long arg) EXPORT_SYMBOL_GPL(inet6_compat_ioctl); #endif /* CONFIG_COMPAT */ =20 -INDIRECT_CALLABLE_DECLARE(int udpv6_sendmsg(struct sock *, struct msghdr *, - size_t)); -int inet6_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) +INDIRECT_CALLABLE_DECLARE(int udpv6_sendmsg(struct sock *, struct msghdr *= )); +int inet6_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; const struct proto *prot; @@ -649,7 +648,7 @@ int inet6_sendmsg(struct socket *sock, struct msghdr *m= sg, size_t size) /* IPV6_ADDRFORM can change sk->sk_prot under us. */ prot =3D READ_ONCE(sk->sk_prot); return INDIRECT_CALL_2(prot->sendmsg, tcp_sendmsg, udpv6_sendmsg, - sk, msg, size); + sk, msg); } =20 INDIRECT_CALLABLE_DECLARE(int udpv6_recvmsg(struct sock *, struct msghdr *, diff --git a/net/ipv6/ping.c b/net/ipv6/ping.c index c4835dbdfcff..54c94b28744f 100644 --- a/net/ipv6/ping.c +++ b/net/ipv6/ping.c @@ -59,7 +59,7 @@ static int ping_v6_pre_connect(struct sock *sk, struct so= ckaddr *uaddr, return BPF_CGROUP_RUN_PROG_INET6_CONNECT_LOCK(sk, uaddr); } =20 -static int ping_v6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) +static int ping_v6_sendmsg(struct sock *sk, struct msghdr *msg) { struct inet_sock *inet =3D inet_sk(sk); struct ipv6_pinfo *np =3D inet6_sk(sk); @@ -73,8 +73,9 @@ static int ping_v6_sendmsg(struct sock *sk, struct msghdr= *msg, size_t len) struct rt6_info *rt; struct pingfakehdr pfh; struct ipcm6_cookie ipc6; + size_t len =3D msg_data_left(msg); =20 - err =3D ping_common_sendmsg(AF_INET6, msg, len, &user_icmph, + err =3D ping_common_sendmsg(AF_INET6, msg, &user_icmph, sizeof(user_icmph)); if (err) return err; diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 6ac2f2690c44..a3437deeeb74 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c @@ -735,7 +735,7 @@ static int raw6_getfrag(void *from, char *to, int offse= t, int len, int odd, return ip_generic_getfrag(rfv->msg, to, offset, len, odd, skb); } =20 -static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) +static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg) { struct ipv6_txoptions *opt_to_free =3D NULL; struct ipv6_txoptions opt_space; @@ -751,6 +751,7 @@ static int rawv6_sendmsg(struct sock *sk, struct msghdr= *msg, size_t len) struct flowi6 fl6; struct ipcm6_cookie ipc6; int addr_len =3D msg->msg_namelen; + size_t len =3D msg_data_left(msg); int hdrincl; u16 proto; int err; diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index d350e57c4792..80f2eb58ba1a 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -1326,7 +1326,7 @@ static int udp_v6_push_pending_frames(struct sock *sk) return err; } =20 -int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) +int udpv6_sendmsg(struct sock *sk, struct msghdr *msg) { struct ipv6_txoptions opt_space; struct udp_sock *up =3D udp_sk(sk); @@ -1343,6 +1343,7 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg= , size_t len) struct ipcm6_cookie ipc6; int addr_len =3D msg->msg_namelen; bool connected =3D false; + size_t len =3D msg_data_left(msg); int ulen =3D len; int corkreq =3D READ_ONCE(up->corkflag) || msg->msg_flags&MSG_MORE; int err; @@ -1397,7 +1398,7 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg= , size_t len) do_udp_sendmsg: if (ipv6_only_sock(sk)) return -ENETUNREACH; - return udp_sendmsg(sk, msg, len); + return udp_sendmsg(sk, msg); } } =20 @@ -1410,7 +1411,7 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg= , size_t len) getfrag =3D is_udplite ? udplite_getfrag : ip_generic_getfrag; if (up->pending) { if (up->pending =3D=3D AF_INET) - return udp_sendmsg(sk, msg, len); + return udp_sendmsg(sk, msg); /* * There are pending frames. * The socket lock must be held while it's corked. diff --git a/net/ipv6/udp_impl.h b/net/ipv6/udp_impl.h index 0590f566379d..c905a5cb34af 100644 --- a/net/ipv6/udp_impl.h +++ b/net/ipv6/udp_impl.h @@ -20,7 +20,7 @@ int udpv6_getsockopt(struct sock *sk, int level, int optn= ame, char __user *optval, int __user *optlen); int udpv6_setsockopt(struct sock *sk, int level, int optname, sockptr_t op= tval, unsigned int optlen); -int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len); +int udpv6_sendmsg(struct sock *sk, struct msghdr *msg); int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int fla= gs, int *addr_len); void udpv6_destroy_sock(struct sock *sk); diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c index 498a0c35b7bb..d963d245a4e2 100644 --- a/net/iucv/af_iucv.c +++ b/net/iucv/af_iucv.c @@ -895,8 +895,7 @@ static int iucv_send_iprm(struct iucv_path *path, struc= t iucv_message *msg, (void *) prmdata, 8); } =20 -static int iucv_sock_sendmsg(struct socket *sock, struct msghdr *msg, - size_t len) +static int iucv_sock_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct iucv_sock *iucv =3D iucv_sk(sk); @@ -905,6 +904,7 @@ static int iucv_sock_sendmsg(struct socket *sock, struc= t msghdr *msg, struct sk_buff *skb; struct iucv_message txmsg =3D {0}; struct cmsghdr *cmsg; + size_t len =3D msg_data_left(msg); int cmsg_done; long timeo; char user_id[9]; diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c index cfe828bd7fc6..caf13ed1bfeb 100644 --- a/net/kcm/kcmsock.c +++ b/net/kcm/kcmsock.c @@ -904,7 +904,7 @@ static ssize_t kcm_sendpage(struct socket *sock, struct= page *page, return err; } =20 -static int kcm_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) +static int kcm_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct kcm_sock *kcm =3D kcm_sk(sk); diff --git a/net/key/af_key.c b/net/key/af_key.c index a815f5ab4c49..3cde1e0c3119 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c @@ -3662,13 +3662,14 @@ static int pfkey_send_migrate(const struct xfrm_sel= ector *sel, u8 dir, u8 type, } #endif =20 -static int pfkey_sendmsg(struct socket *sock, struct msghdr *msg, size_t l= en) +static int pfkey_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct sk_buff *skb =3D NULL; struct sadb_msg *hdr =3D NULL; int err; struct net *net =3D sock_net(sk); + size_t len =3D msg_data_left(msg); =20 err =3D -EOPNOTSUPP; if (msg->msg_flags & MSG_OOB) diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c index 4db5a554bdbd..474ce4ae9b63 100644 --- a/net/l2tp/l2tp_ip.c +++ b/net/l2tp/l2tp_ip.c @@ -394,13 +394,14 @@ static int l2tp_ip_backlog_recv(struct sock *sk, stru= ct sk_buff *skb) /* Userspace will call sendmsg() on the tunnel socket to send L2TP * control frames. */ -static int l2tp_ip_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) +static int l2tp_ip_sendmsg(struct sock *sk, struct msghdr *msg) { struct sk_buff *skb; int rc; struct inet_sock *inet =3D inet_sk(sk); struct rtable *rt =3D NULL; struct flowi4 *fl4; + size_t len =3D msg_data_left(msg); int connected =3D 0; __be32 daddr; =20 diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c index 2478aa60145f..7619afe77855 100644 --- a/net/l2tp/l2tp_ip6.c +++ b/net/l2tp/l2tp_ip6.c @@ -488,7 +488,7 @@ static int l2tp_ip6_push_pending_frames(struct sock *sk) /* Userspace will call sendmsg() on the tunnel socket to send L2TP * control frames. */ -static int l2tp_ip6_sendmsg(struct sock *sk, struct msghdr *msg, size_t le= n) +static int l2tp_ip6_sendmsg(struct sock *sk, struct msghdr *msg) { struct ipv6_txoptions opt_space; DECLARE_SOCKADDR(struct sockaddr_l2tpip6 *, lsa, msg->msg_name); @@ -500,6 +500,7 @@ static int l2tp_ip6_sendmsg(struct sock *sk, struct msg= hdr *msg, size_t len) struct dst_entry *dst =3D NULL; struct flowi6 fl6; struct ipcm6_cookie ipc6; + size_t len =3D msg_data_left(msg); int addr_len =3D msg->msg_namelen; int transhdrlen =3D 4; /* zero session-id */ int ulen; diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c index f011af6601c9..ae351f50adff 100644 --- a/net/l2tp/l2tp_ppp.c +++ b/net/l2tp/l2tp_ppp.c @@ -262,14 +262,14 @@ static void pppol2tp_recv(struct l2tp_session *sessio= n, struct sk_buff *skb, int * when a user application does a sendmsg() on the session socket. L2TP and * PPP headers must be inserted into the user's data. */ -static int pppol2tp_sendmsg(struct socket *sock, struct msghdr *m, - size_t total_len) +static int pppol2tp_sendmsg(struct socket *sock, struct msghdr *m) { struct sock *sk =3D sock->sk; struct sk_buff *skb; int error; struct l2tp_session *session; struct l2tp_tunnel *tunnel; + size_t total_len =3D msg_data_left(m); int uhlen; =20 error =3D -ENOTCONN; diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index da7fe94bea2e..d10b5ef66c88 100644 --- a/net/llc/af_llc.c +++ b/net/llc/af_llc.c @@ -919,12 +919,11 @@ static int llc_ui_recvmsg(struct socket *sock, struct= msghdr *msg, size_t len, * llc_ui_sendmsg - Transmit data provided by the socket user. * @sock: Socket to transmit data from. * @msg: Various user related information. - * @len: Length of data to transmit. * * Transmit data provided by the socket user. * Returns non-negative upon success, negative otherwise. */ -static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t = len) +static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct llc_sock *llc =3D llc_sk(sk); @@ -954,7 +953,7 @@ static int llc_ui_sendmsg(struct socket *sock, struct m= sghdr *msg, size_t len) goto out; } hdrlen =3D llc->dev->hard_header_len + llc_ui_header_len(sk, addr); - size =3D hdrlen + len; + size =3D hdrlen + msg_data_left(msg); if (size > llc->dev->mtu) size =3D llc->dev->mtu; copied =3D size - hdrlen; diff --git a/net/mctp/af_mctp.c b/net/mctp/af_mctp.c index bb4bd0b6a4f7..9ead250f1be3 100644 --- a/net/mctp/af_mctp.c +++ b/net/mctp/af_mctp.c @@ -90,7 +90,7 @@ static int mctp_bind(struct socket *sock, struct sockaddr= *addr, int addrlen) return rc; } =20 -static int mctp_sendmsg(struct socket *sock, struct msghdr *msg, size_t le= n) +static int mctp_sendmsg(struct socket *sock, struct msghdr *msg) { DECLARE_SOCKADDR(struct sockaddr_mctp *, addr, msg->msg_name); int rc, addrlen =3D msg->msg_namelen; @@ -99,6 +99,7 @@ static int mctp_sendmsg(struct socket *sock, struct msghd= r *msg, size_t len) struct mctp_skb_cb *cb; struct mctp_route *rt; struct sk_buff *skb =3D NULL; + size_t len =3D msg_data_left(msg); int hlen; =20 if (addr) { diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 2d26b9114373..0a58f2dbd3ce 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -1663,7 +1663,7 @@ static void mptcp_set_nospace(struct sock *sk) static int mptcp_disconnect(struct sock *sk, int flags); =20 static int mptcp_sendmsg_fastopen(struct sock *sk, struct sock *ssk, struc= t msghdr *msg, - size_t len, int *copied_syn) + int *copied_syn) { unsigned int saved_flags =3D msg->msg_flags; struct mptcp_sock *msk =3D mptcp_sk(sk); @@ -1673,7 +1673,7 @@ static int mptcp_sendmsg_fastopen(struct sock *sk, st= ruct sock *ssk, struct msgh msg->msg_flags |=3D MSG_DONTWAIT; msk->connect_flags =3D O_NONBLOCK; msk->fastopening =3D 1; - ret =3D tcp_sendmsg_fastopen(ssk, msg, copied_syn, len, NULL); + ret =3D tcp_sendmsg_fastopen(ssk, msg, copied_syn, NULL); msk->fastopening =3D 0; msg->msg_flags =3D saved_flags; release_sock(ssk); @@ -1695,7 +1695,7 @@ static int mptcp_sendmsg_fastopen(struct sock *sk, st= ruct sock *ssk, struct msgh return ret; } =20 -static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) +static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg) { struct mptcp_sock *msk =3D mptcp_sk(sk); struct page_frag *pfrag; @@ -1714,7 +1714,7 @@ static int mptcp_sendmsg(struct sock *sk, struct msgh= dr *msg, size_t len) msg->msg_flags & MSG_FASTOPEN))) { int copied_syn =3D 0; =20 - ret =3D mptcp_sendmsg_fastopen(sk, ssock->sk, msg, len, &copied_syn); + ret =3D mptcp_sendmsg_fastopen(sk, ssock->sk, msg, &copied_syn); copied +=3D copied_syn; if (ret =3D=3D -EINPROGRESS && copied_syn > 0) goto out; diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 877f1da1a8ac..519487cbfcce 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -1857,7 +1857,7 @@ static void netlink_cmsg_listen_all_nsid(struct sock = *sk, struct msghdr *msg, &NETLINK_CB(skb).nsid); } =20 -static int netlink_sendmsg(struct socket *sock, struct msghdr *msg, size_t= len) +static int netlink_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct netlink_sock *nlk =3D nlk_sk(sk); @@ -1872,7 +1872,7 @@ static int netlink_sendmsg(struct socket *sock, struc= t msghdr *msg, size_t len) if (msg->msg_flags & MSG_OOB) return -EOPNOTSUPP; =20 - if (len =3D=3D 0) { + if (msg_data_left(msg) =3D=3D 0) { pr_warn_once("Zero length message leads to an empty skb\n"); return -ENODATA; } @@ -1911,10 +1911,10 @@ static int netlink_sendmsg(struct socket *sock, str= uct msghdr *msg, size_t len) } =20 err =3D -EMSGSIZE; - if (len > sk->sk_sndbuf - 32) + if (msg_data_left(msg) > sk->sk_sndbuf - 32) goto out; err =3D -ENOBUFS; - skb =3D netlink_alloc_large_skb(len, dst_group); + skb =3D netlink_alloc_large_skb(msg_data_left(msg), dst_group); if (skb =3D=3D NULL) goto out; =20 @@ -1924,7 +1924,8 @@ static int netlink_sendmsg(struct socket *sock, struc= t msghdr *msg, size_t len) NETLINK_CB(skb).flags =3D netlink_skb_flags; =20 err =3D -EFAULT; - if (memcpy_from_msg(skb_put(skb, len), msg, len)) { + if (memcpy_from_msg(skb_put(skb, msg_data_left(msg)), + msg, msg_data_left(msg))) { kfree_skb(skb); goto out; } diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index 5a4cb796150f..d2c65f38c22c 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c @@ -1034,7 +1034,7 @@ int nr_rx_frame(struct sk_buff *skb, struct net_devic= e *dev) return 1; } =20 -static int nr_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) +static int nr_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct nr_sock *nr =3D nr_sk(sk); @@ -1043,6 +1043,7 @@ static int nr_sendmsg(struct socket *sock, struct msg= hdr *msg, size_t len) struct sockaddr_ax25 sax; struct sk_buff *skb; unsigned char *asmptr; + size_t len =3D msg_data_left(msg); int size; =20 if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_CMSG_COMPAT)) diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c index 77642d18a3b4..70226fc36396 100644 --- a/net/nfc/llcp_sock.c +++ b/net/nfc/llcp_sock.c @@ -770,8 +770,7 @@ static int llcp_sock_connect(struct socket *sock, struc= t sockaddr *_addr, return ret; } =20 -static int llcp_sock_sendmsg(struct socket *sock, struct msghdr *msg, - size_t len) +static int llcp_sock_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct nfc_llcp_sock *llcp_sock =3D nfc_llcp_sock(sk); @@ -805,7 +804,7 @@ static int llcp_sock_sendmsg(struct socket *sock, struc= t msghdr *msg, release_sock(sk); =20 return nfc_llcp_send_ui_frame(llcp_sock, addr->dsap, addr->ssap, - msg, len); + msg, msg_data_left(msg)); } =20 if (sk->sk_state !=3D LLCP_CONNECTED) { @@ -815,7 +814,7 @@ static int llcp_sock_sendmsg(struct socket *sock, struc= t msghdr *msg, =20 release_sock(sk); =20 - return nfc_llcp_send_i_frame(llcp_sock, msg, len); + return nfc_llcp_send_i_frame(llcp_sock, msg, msg_data_left(msg)); } =20 static int llcp_sock_recvmsg(struct socket *sock, struct msghdr *msg, diff --git a/net/nfc/rawsock.c b/net/nfc/rawsock.c index 5125392bb68e..d9d54240b2a2 100644 --- a/net/nfc/rawsock.c +++ b/net/nfc/rawsock.c @@ -202,11 +202,12 @@ static void rawsock_tx_work(struct work_struct *work) kcov_remote_stop(); } =20 -static int rawsock_sendmsg(struct socket *sock, struct msghdr *msg, size_t= len) +static int rawsock_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct nfc_dev *dev =3D nfc_rawsock(sk)->dev; struct sk_buff *skb; + size_t len =3D msg_data_left(msg); int rc; =20 pr_debug("sock=3D%p sk=3D%p len=3D%zu\n", sock, sk, len); diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 497193f73030..84a95e177260 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -1947,14 +1947,14 @@ static void packet_parse_headers(struct sk_buff *sk= b, struct socket *sock) * protocol layers and you must therefore supply it with a complete frame */ =20 -static int packet_sendmsg_spkt(struct socket *sock, struct msghdr *msg, - size_t len) +static int packet_sendmsg_spkt(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; DECLARE_SOCKADDR(struct sockaddr_pkt *, saddr, msg->msg_name); struct sk_buff *skb =3D NULL; struct net_device *dev; struct sockcm_cookie sockc; + size_t len =3D msg_data_left(msg); __be16 proto =3D 0; int err; int extra_len =3D 0; @@ -2933,7 +2933,7 @@ static struct sk_buff *packet_alloc_skb(struct sock *= sk, size_t prepad, return skb; } =20 -static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) +static int packet_snd(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; DECLARE_SOCKADDR(struct sockaddr_ll *, saddr, msg->msg_name); @@ -2946,6 +2946,7 @@ static int packet_snd(struct socket *sock, struct msg= hdr *msg, size_t len) struct virtio_net_hdr vnet_hdr =3D { 0 }; int offset =3D 0; struct packet_sock *po =3D pkt_sk(sk); + size_t len =3D msg_data_left(msg); bool has_vnet_hdr =3D false; int hlen, tlen, linear; int extra_len =3D 0; @@ -3093,7 +3094,7 @@ static int packet_snd(struct socket *sock, struct msg= hdr *msg, size_t len) return err; } =20 -static int packet_sendmsg(struct socket *sock, struct msghdr *msg, size_t = len) +static int packet_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct packet_sock *po =3D pkt_sk(sk); @@ -3104,7 +3105,7 @@ static int packet_sendmsg(struct socket *sock, struct= msghdr *msg, size_t len) if (data_race(po->tx_ring.pg_vec)) return tpacket_snd(po, msg); =20 - return packet_snd(sock, msg, len); + return packet_snd(sock, msg); } =20 /* diff --git a/net/phonet/datagram.c b/net/phonet/datagram.c index ff5f49ab236e..4839f7d6785b 100644 --- a/net/phonet/datagram.c +++ b/net/phonet/datagram.c @@ -70,10 +70,11 @@ static int pn_init(struct sock *sk) return 0; } =20 -static int pn_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) +static int pn_sendmsg(struct sock *sk, struct msghdr *msg) { DECLARE_SOCKADDR(struct sockaddr_pn *, target, msg->msg_name); struct sk_buff *skb; + size_t len =3D msg_data_left(msg); int err; =20 if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_NOSIGNAL| diff --git a/net/phonet/pep.c b/net/phonet/pep.c index 83ea13a50690..5afc99ab9eca 100644 --- a/net/phonet/pep.c +++ b/net/phonet/pep.c @@ -1112,10 +1112,11 @@ static int pipe_skb_send(struct sock *sk, struct sk= _buff *skb) =20 } =20 -static int pep_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) +static int pep_sendmsg(struct sock *sk, struct msghdr *msg) { struct pep_sock *pn =3D pep_sk(sk); struct sk_buff *skb; + size_t len =3D msg_data_left(msg); long timeo; int flags =3D msg->msg_flags; int err, done; diff --git a/net/phonet/socket.c b/net/phonet/socket.c index 71e2caf6ab85..99cd62f64944 100644 --- a/net/phonet/socket.c +++ b/net/phonet/socket.c @@ -414,15 +414,14 @@ static int pn_socket_listen(struct socket *sock, int = backlog) return err; } =20 -static int pn_socket_sendmsg(struct socket *sock, struct msghdr *m, - size_t total_len) +static int pn_socket_sendmsg(struct socket *sock, struct msghdr *m) { struct sock *sk =3D sock->sk; =20 if (pn_socket_autobind(sock)) return -EAGAIN; =20 - return sk->sk_prot->sendmsg(sk, m, total_len); + return sk->sk_prot->sendmsg(sk, m); } =20 const struct proto_ops phonet_dgram_ops =3D { diff --git a/net/qrtr/af_qrtr.c b/net/qrtr/af_qrtr.c index 5c2fb992803b..7c1b908dd479 100644 --- a/net/qrtr/af_qrtr.c +++ b/net/qrtr/af_qrtr.c @@ -888,7 +888,7 @@ static int qrtr_bcast_enqueue(struct qrtr_node *node, s= truct sk_buff *skb, return 0; } =20 -static int qrtr_sendmsg(struct socket *sock, struct msghdr *msg, size_t le= n) +static int qrtr_sendmsg(struct socket *sock, struct msghdr *msg) { DECLARE_SOCKADDR(struct sockaddr_qrtr *, addr, msg->msg_name); int (*enqueue_fn)(struct qrtr_node *, struct sk_buff *, int, @@ -898,7 +898,7 @@ static int qrtr_sendmsg(struct socket *sock, struct msg= hdr *msg, size_t len) struct sock *sk =3D sock->sk; struct qrtr_node *node; struct sk_buff *skb; - size_t plen; + size_t plen, len =3D msg_data_left(msg); u32 type; int rc; =20 diff --git a/net/rds/rds.h b/net/rds/rds.h index d35d1fc39807..9e8ecafd5b51 100644 --- a/net/rds/rds.h +++ b/net/rds/rds.h @@ -909,7 +909,7 @@ void rds6_inc_info_copy(struct rds_incoming *inc, int flip); =20 /* send.c */ -int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_le= n); +int rds_sendmsg(struct socket *sock, struct msghdr *msg); void rds_send_path_reset(struct rds_conn_path *conn); int rds_send_xmit(struct rds_conn_path *cp); struct sockaddr_in; diff --git a/net/rds/send.c b/net/rds/send.c index 5e57a1581dc6..f588b720e1c3 100644 --- a/net/rds/send.c +++ b/net/rds/send.c @@ -1098,7 +1098,7 @@ static int rds_rdma_bytes(struct msghdr *msg, size_t = *rdma_bytes) return 0; } =20 -int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_le= n) +int rds_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct rds_sock *rs =3D rds_sk_to_rs(sk); @@ -1114,6 +1114,7 @@ int rds_sendmsg(struct socket *sock, struct msghdr *m= sg, size_t payload_len) struct rds_conn_path *cpath; struct in6_addr daddr; __u32 scope_id =3D 0; + size_t payload_len =3D msg_data_left(msg); size_t rdma_payload_len =3D 0; bool zcopy =3D ((msg->msg_flags & MSG_ZEROCOPY) && sock_flag(rds_rs_to_sk(rs), SOCK_ZEROCOPY)); diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c index ca2b17f32670..938ea0716751 100644 --- a/net/rose/af_rose.c +++ b/net/rose/af_rose.c @@ -1069,7 +1069,7 @@ int rose_rx_call_request(struct sk_buff *skb, struct = net_device *dev, struct ros return 1; } =20 -static int rose_sendmsg(struct socket *sock, struct msghdr *msg, size_t le= n) +static int rose_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct rose_sock *rose =3D rose_sk(sk); @@ -1078,6 +1078,7 @@ static int rose_sendmsg(struct socket *sock, struct m= sghdr *msg, size_t len) struct full_sockaddr_rose srose; struct sk_buff *skb; unsigned char *asmptr; + size_t len =3D msg_data_left(msg); int n, size, qbit =3D 0; =20 if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_CMSG_COMPAT)) diff --git a/net/rxrpc/af_rxrpc.c b/net/rxrpc/af_rxrpc.c index 102f5cbff91a..bdce6ab30899 100644 --- a/net/rxrpc/af_rxrpc.c +++ b/net/rxrpc/af_rxrpc.c @@ -502,13 +502,13 @@ static int rxrpc_connect(struct socket *sock, struct = sockaddr *addr, * - sends a call data packet * - may send an abort (abort code in control data) */ -static int rxrpc_sendmsg(struct socket *sock, struct msghdr *m, size_t len) +static int rxrpc_sendmsg(struct socket *sock, struct msghdr *m) { struct rxrpc_local *local; struct rxrpc_sock *rx =3D rxrpc_sk(sock->sk); int ret; =20 - _enter(",{%d},,%zu", rx->sk.sk_state, len); + _enter(",{%d},,%zu", rx->sk.sk_state, msg_data_left(m)); =20 if (m->msg_flags & MSG_OOB) return -EOPNOTSUPP; @@ -562,7 +562,7 @@ static int rxrpc_sendmsg(struct socket *sock, struct ms= ghdr *m, size_t len) fallthrough; case RXRPC_SERVER_BOUND: case RXRPC_SERVER_LISTENING: - ret =3D rxrpc_do_sendmsg(rx, m, len); + ret =3D rxrpc_do_sendmsg(rx, m); /* The socket has been unlocked */ goto out; default: diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h index 67b0a894162d..36738f8f050d 100644 --- a/net/rxrpc/ar-internal.h +++ b/net/rxrpc/ar-internal.h @@ -1221,7 +1221,7 @@ struct key *rxrpc_look_up_server_security(struct rxrp= c_connection *, */ bool rxrpc_propose_abort(struct rxrpc_call *call, s32 abort_code, int erro= r, enum rxrpc_abort_reason why); -int rxrpc_do_sendmsg(struct rxrpc_sock *, struct msghdr *, size_t); +int rxrpc_do_sendmsg(struct rxrpc_sock *, struct msghdr *); =20 /* * server_key.c diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c index 5e53429c6922..0f3ff3455101 100644 --- a/net/rxrpc/output.c +++ b/net/rxrpc/output.c @@ -16,9 +16,9 @@ #include #include "ar-internal.h" =20 -extern int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len); +extern int udpv6_sendmsg(struct sock *sk, struct msghdr *msg); =20 -static ssize_t do_udp_sendmsg(struct socket *socket, struct msghdr *msg, s= ize_t len) +static ssize_t do_udp_sendmsg(struct socket *socket, struct msghdr *msg) { struct sockaddr *sa =3D msg->msg_name; struct sock *sk =3D socket->sk; @@ -29,10 +29,10 @@ static ssize_t do_udp_sendmsg(struct socket *socket, st= ruct msghdr *msg, size_t pr_warn("AF_INET6 address on AF_INET socket\n"); return -ENOPROTOOPT; } - return udpv6_sendmsg(sk, msg, len); + return udpv6_sendmsg(sk, msg); } } - return udp_sendmsg(sk, msg, len); + return udp_sendmsg(sk, msg); } =20 struct rxrpc_abort_buffer { @@ -232,7 +232,7 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, stru= ct rxrpc_txbuf *txb) txb->ack.previousPacket =3D htonl(call->rx_highest_seq); =20 iov_iter_kvec(&msg.msg_iter, WRITE, iov, 1, len); - ret =3D do_udp_sendmsg(conn->local->socket, &msg, len); + ret =3D do_udp_sendmsg(conn->local->socket, &msg); call->peer->last_tx_at =3D ktime_get_seconds(); if (ret < 0) { trace_rxrpc_tx_fail(call->debug_id, serial, ret, @@ -306,7 +306,7 @@ int rxrpc_send_abort_packet(struct rxrpc_call *call) pkt.whdr.serial =3D htonl(serial); =20 iov_iter_kvec(&msg.msg_iter, WRITE, iov, 1, sizeof(pkt)); - ret =3D do_udp_sendmsg(conn->local->socket, &msg, sizeof(pkt)); + ret =3D do_udp_sendmsg(conn->local->socket, &msg); conn->peer->last_tx_at =3D ktime_get_seconds(); if (ret < 0) trace_rxrpc_tx_fail(call->debug_id, serial, ret, @@ -424,7 +424,7 @@ int rxrpc_send_data_packet(struct rxrpc_call *call, str= uct rxrpc_txbuf *txb) * message and update the peer record */ rxrpc_inc_stat(call->rxnet, stat_tx_data_send); - ret =3D do_udp_sendmsg(conn->local->socket, &msg, len); + ret =3D do_udp_sendmsg(conn->local->socket, &msg); conn->peer->last_tx_at =3D ktime_get_seconds(); =20 if (ret < 0) { @@ -497,7 +497,7 @@ int rxrpc_send_data_packet(struct rxrpc_call *call, str= uct rxrpc_txbuf *txb) ip_sock_set_mtu_discover(conn->local->socket->sk, IP_PMTUDISC_DONT); rxrpc_inc_stat(call->rxnet, stat_tx_data_send_frag); - ret =3D do_udp_sendmsg(conn->local->socket, &msg, len); + ret =3D do_udp_sendmsg(conn->local->socket, &msg); conn->peer->last_tx_at =3D ktime_get_seconds(); =20 ip_sock_set_mtu_discover(conn->local->socket->sk, @@ -564,7 +564,7 @@ void rxrpc_send_conn_abort(struct rxrpc_connection *con= n) whdr.serial =3D htonl(serial); =20 iov_iter_kvec(&msg.msg_iter, WRITE, iov, 2, len); - ret =3D do_udp_sendmsg(conn->local->socket, &msg, len); + ret =3D do_udp_sendmsg(conn->local->socket, &msg); if (ret < 0) { trace_rxrpc_tx_fail(conn->debug_id, serial, ret, rxrpc_tx_point_conn_abort); @@ -633,7 +633,7 @@ void rxrpc_reject_packet(struct rxrpc_local *local, str= uct sk_buff *skb) whdr.flags &=3D RXRPC_CLIENT_INITIATED; =20 iov_iter_kvec(&msg.msg_iter, WRITE, iov, ioc, size); - ret =3D do_udp_sendmsg(local->socket, &msg, size); + ret =3D do_udp_sendmsg(local->socket, &msg); if (ret < 0) trace_rxrpc_tx_fail(local->debug_id, 0, ret, rxrpc_tx_point_reject); @@ -682,7 +682,7 @@ void rxrpc_send_keepalive(struct rxrpc_peer *peer) len =3D iov[0].iov_len + iov[1].iov_len; =20 iov_iter_kvec(&msg.msg_iter, WRITE, iov, 2, len); - ret =3D do_udp_sendmsg(peer->local->socket, &msg, len); + ret =3D do_udp_sendmsg(peer->local->socket, &msg); if (ret < 0) trace_rxrpc_tx_fail(peer->debug_id, 0, ret, rxrpc_tx_point_version_keepalive); diff --git a/net/rxrpc/rxperf.c b/net/rxrpc/rxperf.c index 4a2e90015ca7..0167afb67a7a 100644 --- a/net/rxrpc/rxperf.c +++ b/net/rxrpc/rxperf.c @@ -507,7 +507,7 @@ static int rxperf_process_call(struct rxperf_call *call) iov_iter_bvec(&msg.msg_iter, WRITE, &bv, 1, len); msg.msg_flags =3D MSG_MORE; n =3D rxrpc_kernel_send_data(rxperf_socket, call->rxcall, &msg, - len, rxperf_notify_end_reply_tx); + rxperf_notify_end_reply_tx); if (n < 0) return n; if (n =3D=3D 0) @@ -520,7 +520,7 @@ static int rxperf_process_call(struct rxperf_call *call) iov[0].iov_len =3D len; iov_iter_kvec(&msg.msg_iter, WRITE, iov, 1, len); msg.msg_flags =3D 0; - n =3D rxrpc_kernel_send_data(rxperf_socket, call->rxcall, &msg, len, + n =3D rxrpc_kernel_send_data(rxperf_socket, call->rxcall, &msg, rxperf_notify_end_reply_tx); if (n >=3D 0) return 0; /* Success */ diff --git a/net/rxrpc/sendmsg.c b/net/rxrpc/sendmsg.c index da49fcf1c456..b6ffd8124ced 100644 --- a/net/rxrpc/sendmsg.c +++ b/net/rxrpc/sendmsg.c @@ -280,7 +280,7 @@ static void rxrpc_queue_packet(struct rxrpc_sock *rx, s= truct rxrpc_call *call, */ static int rxrpc_send_data(struct rxrpc_sock *rx, struct rxrpc_call *call, - struct msghdr *msg, size_t len, + struct msghdr *msg, rxrpc_notify_end_tx_t notify_end_tx, bool *_dropped_lock) { @@ -327,9 +327,9 @@ static int rxrpc_send_data(struct rxrpc_sock *rx, =20 ret =3D -EMSGSIZE; if (call->tx_total_len !=3D -1) { - if (len - copied > call->tx_total_len) + if (msg_data_left(msg) > call->tx_total_len) goto maybe_error; - if (!more && len - copied !=3D call->tx_total_len) + if (!more && msg_data_left(msg) !=3D call->tx_total_len) goto maybe_error; } =20 @@ -612,7 +612,7 @@ rxrpc_new_client_call_for_sendmsg(struct rxrpc_sock *rx= , struct msghdr *msg, * - caller holds the socket locked * - the socket may be either a client socket or a server socket */ -int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg, size_t len) +int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg) __releases(&rx->sk.sk_lock.slock) { struct rxrpc_call *call; @@ -723,7 +723,7 @@ int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msgh= dr *msg, size_t len) } else if (p.command !=3D RXRPC_CMD_SEND_DATA) { ret =3D -EINVAL; } else { - ret =3D rxrpc_send_data(rx, call, msg, len, NULL, &dropped_lock); + ret =3D rxrpc_send_data(rx, call, msg, NULL, &dropped_lock); } =20 out_put_unlock: @@ -744,7 +744,6 @@ int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msgh= dr *msg, size_t len) * @sock: The socket the call is on * @call: The call to send data through * @msg: The data to send - * @len: The amount of data to send * @notify_end_tx: Notification that the last packet is queued. * * Allow a kernel service to send data on a call. The call must be in an = state @@ -753,7 +752,7 @@ int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msgh= dr *msg, size_t len) * more data to come, otherwise this data will end the transmission phase. */ int rxrpc_kernel_send_data(struct socket *sock, struct rxrpc_call *call, - struct msghdr *msg, size_t len, + struct msghdr *msg, rxrpc_notify_end_tx_t notify_end_tx) { bool dropped_lock =3D false; @@ -766,7 +765,7 @@ int rxrpc_kernel_send_data(struct socket *sock, struct = rxrpc_call *call, =20 mutex_lock(&call->user_mutex); =20 - ret =3D rxrpc_send_data(rxrpc_sk(sock->sk), call, msg, len, + ret =3D rxrpc_send_data(rxrpc_sk(sock->sk), call, msg, notify_end_tx, &dropped_lock); if (ret =3D=3D -ESHUTDOWN) ret =3D call->error; diff --git a/net/sctp/socket.c b/net/sctp/socket.c index b91616f819de..da99aab89d82 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -1935,7 +1935,7 @@ static void sctp_sendmsg_update_sinfo(struct sctp_ass= ociation *asoc, } } =20 -static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_le= n) +static int sctp_sendmsg(struct sock *sk, struct msghdr *msg) { struct sctp_endpoint *ep =3D sctp_sk(sk)->ep; struct sctp_transport *transport =3D NULL; @@ -1943,6 +1943,7 @@ static int sctp_sendmsg(struct sock *sk, struct msghd= r *msg, size_t msg_len) struct sctp_association *asoc, *tmp; struct sctp_cmsgs cmsgs; union sctp_addr *daddr; + size_t msg_len =3D msg_data_left(msg); bool new =3D false; __u16 sflags; int err; diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c index c6b4a62276f6..0e725698ebcd 100644 --- a/net/smc/af_smc.c +++ b/net/smc/af_smc.c @@ -2653,10 +2653,11 @@ static int smc_getname(struct socket *sock, struct = sockaddr *addr, return smc->clcsock->ops->getname(smc->clcsock, addr, peer); } =20 -static int smc_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) +static int smc_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct smc_sock *smc; + size_t len =3D msg_data_left(msg); int rc; =20 smc =3D smc_sk(sk); @@ -2681,7 +2682,7 @@ static int smc_sendmsg(struct socket *sock, struct ms= ghdr *msg, size_t len) } =20 if (smc->use_fallback) { - rc =3D smc->clcsock->ops->sendmsg(smc->clcsock, msg, len); + rc =3D smc->clcsock->ops->sendmsg(smc->clcsock, msg); } else { rc =3D smc_tx_sendmsg(smc, msg, len); SMC_STAT_TX_PAYLOAD(smc, len, rc); diff --git a/net/socket.c b/net/socket.c index 73e493da4589..1690e1782bf0 100644 --- a/net/socket.c +++ b/net/socket.c @@ -708,10 +708,8 @@ void __sock_tx_timestamp(__u16 tsflags, __u8 *tx_flags) } EXPORT_SYMBOL(__sock_tx_timestamp); =20 -INDIRECT_CALLABLE_DECLARE(int inet_sendmsg(struct socket *, struct msghdr = *, - size_t)); -INDIRECT_CALLABLE_DECLARE(int inet6_sendmsg(struct socket *, struct msghdr= *, - size_t)); +INDIRECT_CALLABLE_DECLARE(int inet_sendmsg(struct socket *, struct msghdr = *)); +INDIRECT_CALLABLE_DECLARE(int inet6_sendmsg(struct socket *, struct msghdr= *)); =20 static noinline void call_trace_sock_send_length(struct sock *sk, int ret, int flags) @@ -722,8 +720,7 @@ static noinline void call_trace_sock_send_length(struct= sock *sk, int ret, static inline int sock_sendmsg_nosec(struct socket *sock, struct msghdr *m= sg) { int ret =3D INDIRECT_CALL_INET(sock->ops->sendmsg, inet6_sendmsg, - inet_sendmsg, sock, msg, - msg_data_left(msg)); + inet_sendmsg, sock, msg); BUG_ON(ret =3D=3D -EIOCBQUEUED); =20 if (trace_sock_send_length_enabled()) @@ -741,8 +738,7 @@ static inline int sock_sendmsg_nosec(struct socket *soc= k, struct msghdr *msg) */ int sock_sendmsg(struct socket *sock, struct msghdr *msg) { - int err =3D security_socket_sendmsg(sock, msg, - msg_data_left(msg)); + int err =3D security_socket_sendmsg(sock, msg); =20 return err ?: sock_sendmsg_nosec(sock, msg); } @@ -787,11 +783,11 @@ int kernel_sendmsg_locked(struct sock *sk, struct msg= hdr *msg, struct socket *sock =3D sk->sk_socket; =20 if (!sock->ops->sendmsg_locked) - return sock_no_sendmsg_locked(sk, msg, size); + return sock_no_sendmsg_locked(sk, msg); =20 iov_iter_kvec(&msg->msg_iter, ITER_SOURCE, vec, num, size); =20 - return sock->ops->sendmsg_locked(sk, msg, msg_data_left(msg)); + return sock->ops->sendmsg_locked(sk, msg); } EXPORT_SYMBOL(kernel_sendmsg_locked); =20 diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 37edfe10f8c6..bd677e707548 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -156,8 +156,8 @@ static int tipc_sk_leave(struct tipc_sock *tsk); static struct tipc_sock *tipc_sk_lookup(struct net *net, u32 portid); static int tipc_sk_insert(struct tipc_sock *tsk); static void tipc_sk_remove(struct tipc_sock *tsk); -static int __tipc_sendstream(struct socket *sock, struct msghdr *m, size_t= dsz); -static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t ds= z); +static int __tipc_sendstream(struct socket *sock, struct msghdr *m); +static int __tipc_sendmsg(struct socket *sock, struct msghdr *m); static void tipc_sk_push_backlog(struct tipc_sock *tsk, bool nagle_ack); static int tipc_wait_for_connect(struct socket *sock, long *timeo_p); =20 @@ -1385,7 +1385,6 @@ static void tipc_sk_conn_proto_rcv(struct tipc_sock *= tsk, struct sk_buff *skb, * tipc_sendmsg - send message in connectionless manner * @sock: socket structure * @m: message to send - * @dsz: amount of user data to be sent * * Message must have an destination specified explicitly. * Used for SOCK_RDM and SOCK_DGRAM messages, @@ -1394,20 +1393,19 @@ static void tipc_sk_conn_proto_rcv(struct tipc_sock= *tsk, struct sk_buff *skb, * * Return: the number of bytes sent on success, or errno otherwise */ -static int tipc_sendmsg(struct socket *sock, - struct msghdr *m, size_t dsz) +static int tipc_sendmsg(struct socket *sock, struct msghdr *m) { struct sock *sk =3D sock->sk; int ret; =20 lock_sock(sk); - ret =3D __tipc_sendmsg(sock, m, dsz); + ret =3D __tipc_sendmsg(sock, m); release_sock(sk); =20 return ret; } =20 -static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dl= en) +static int __tipc_sendmsg(struct socket *sock, struct msghdr *m) { struct sock *sk =3D sock->sk; struct net *net =3D sock_net(sk); @@ -1420,6 +1418,7 @@ static int __tipc_sendmsg(struct socket *sock, struct= msghdr *m, size_t dlen) struct tipc_msg *hdr =3D &tsk->phdr; struct tipc_socket_addr skaddr; struct sk_buff_head pkts; + size_t dlen =3D msg_data_left(m); int atype, mtu, rc; =20 if (unlikely(dlen > TIPC_MAX_USER_MSG_SIZE)) @@ -1535,26 +1534,25 @@ static int __tipc_sendmsg(struct socket *sock, stru= ct msghdr *m, size_t dlen) * tipc_sendstream - send stream-oriented data * @sock: socket structure * @m: data to send - * @dsz: total length of data to be transmitted * * Used for SOCK_STREAM data. * * Return: the number of bytes sent on success (or partial success), * or errno if no data sent */ -static int tipc_sendstream(struct socket *sock, struct msghdr *m, size_t d= sz) +static int tipc_sendstream(struct socket *sock, struct msghdr *m) { struct sock *sk =3D sock->sk; int ret; =20 lock_sock(sk); - ret =3D __tipc_sendstream(sock, m, dsz); + ret =3D __tipc_sendstream(sock, m); release_sock(sk); =20 return ret; } =20 -static int __tipc_sendstream(struct socket *sock, struct msghdr *m, size_t= dlen) +static int __tipc_sendstream(struct socket *sock, struct msghdr *m) { struct sock *sk =3D sock->sk; DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name); @@ -1564,6 +1562,7 @@ static int __tipc_sendstream(struct socket *sock, str= uct msghdr *m, size_t dlen) struct tipc_msg *hdr =3D &tsk->phdr; struct net *net =3D sock_net(sk); struct sk_buff *skb; + size_t dlen =3D msg_data_left(m); u32 dnode =3D tsk_peer_node(tsk); int maxnagle =3D tsk->maxnagle; int maxpkt =3D tsk->max_pkt; @@ -1575,7 +1574,7 @@ static int __tipc_sendstream(struct socket *sock, str= uct msghdr *m, size_t dlen) =20 /* Handle implicit connection setup */ if (unlikely(dest && sk->sk_state =3D=3D TIPC_OPEN)) { - rc =3D __tipc_sendmsg(sock, m, dlen); + rc =3D __tipc_sendmsg(sock, m); if (dlen && dlen =3D=3D rc) { tsk->peer_caps =3D tipc_node_get_capabilities(net, dnode); tsk->snt_unacked =3D tsk_inc(tsk, dlen + msg_hdr_sz(hdr)); @@ -1643,18 +1642,17 @@ static int __tipc_sendstream(struct socket *sock, s= truct msghdr *m, size_t dlen) * tipc_send_packet - send a connection-oriented message * @sock: socket structure * @m: message to send - * @dsz: length of data to be transmitted * * Used for SOCK_SEQPACKET messages. * * Return: the number of bytes sent on success, or errno otherwise */ -static int tipc_send_packet(struct socket *sock, struct msghdr *m, size_t = dsz) +static int tipc_send_packet(struct socket *sock, struct msghdr *m) { - if (dsz > TIPC_MAX_USER_MSG_SIZE) + if (msg_data_left(m) > TIPC_MAX_USER_MSG_SIZE) return -EMSGSIZE; =20 - return tipc_sendstream(sock, m, dsz); + return tipc_sendstream(sock, m); } =20 /* tipc_sk_finish_conn - complete the setup of a connection @@ -2625,7 +2623,7 @@ static int tipc_connect(struct socket *sock, struct s= ockaddr *dest, if (!timeout) m.msg_flags =3D MSG_DONTWAIT; =20 - res =3D __tipc_sendmsg(sock, &m, 0); + res =3D __tipc_sendmsg(sock, &m); if ((res < 0) && (res !=3D -EWOULDBLOCK)) goto exit; =20 @@ -2781,7 +2779,7 @@ static int tipc_accept(struct socket *sock, struct so= cket *new_sock, int flags, skb_set_owner_r(buf, new_sk); } iov_iter_kvec(&m.msg_iter, ITER_SOURCE, NULL, 0, 0); - __tipc_sendstream(new_sock, &m, 0); + __tipc_sendstream(new_sock, &m); release_sock(new_sk); exit: release_sock(sk); diff --git a/net/tls/tls.h b/net/tls/tls.h index 804c3880d028..a969955ddd7c 100644 --- a/net/tls/tls.h +++ b/net/tls/tls.h @@ -96,7 +96,7 @@ int tls_set_sw_offload(struct sock *sk, struct tls_contex= t *ctx, int tx); void tls_update_rx_zc_capable(struct tls_context *tls_ctx); void tls_sw_strparser_arm(struct sock *sk, struct tls_context *ctx); void tls_sw_strparser_done(struct tls_context *tls_ctx); -int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size); +int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg); int tls_sw_sendpage_locked(struct sock *sk, struct page *page, int offset, size_t size, int flags); int tls_sw_sendpage(struct sock *sk, struct page *page, @@ -114,7 +114,7 @@ ssize_t tls_sw_splice_read(struct socket *sock, loff_t = *ppos, struct pipe_inode_info *pipe, size_t len, unsigned int flags); =20 -int tls_device_sendmsg(struct sock *sk, struct msghdr *msg, size_t size); +int tls_device_sendmsg(struct sock *sk, struct msghdr *msg); int tls_device_sendpage(struct sock *sk, struct page *page, int offset, size_t size, int flags); int tls_tx_records(struct sock *sk, int flags); diff --git a/net/tls/tls_device.c b/net/tls/tls_device.c index a7cc4f9faac2..3616dde20a96 100644 --- a/net/tls/tls_device.c +++ b/net/tls/tls_device.c @@ -566,7 +566,7 @@ static int tls_push_data(struct sock *sk, return rc; } =20 -int tls_device_sendmsg(struct sock *sk, struct msghdr *msg, size_t size) +int tls_device_sendmsg(struct sock *sk, struct msghdr *msg) { unsigned char record_type =3D TLS_RECORD_TYPE_DATA; struct tls_context *tls_ctx =3D tls_get_ctx(sk); @@ -583,7 +583,8 @@ int tls_device_sendmsg(struct sock *sk, struct msghdr *= msg, size_t size) } =20 iter.msg_iter =3D &msg->msg_iter; - rc =3D tls_push_data(sk, iter, size, msg->msg_flags, record_type, NULL); + rc =3D tls_push_data(sk, iter, msg_data_left(msg), msg->msg_flags, + record_type, NULL); =20 out: release_sock(sk); diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index 635b8bf6b937..17ea9b07a277 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -929,7 +929,7 @@ static int tls_sw_push_pending_record(struct sock *sk, = int flags) &copied, flags); } =20 -int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size) +int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg) { long timeo =3D sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); struct tls_context *tls_ctx =3D tls_get_ctx(sk); diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index fb31e8a4409e..37c96a73e6b4 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -756,20 +756,20 @@ static int unix_ioctl(struct socket *, unsigned int, = unsigned long); static int unix_compat_ioctl(struct socket *sock, unsigned int cmd, unsign= ed long arg); #endif static int unix_shutdown(struct socket *, int); -static int unix_stream_sendmsg(struct socket *, struct msghdr *, size_t); +static int unix_stream_sendmsg(struct socket *, struct msghdr *); static int unix_stream_recvmsg(struct socket *, struct msghdr *, size_t, i= nt); static ssize_t unix_stream_sendpage(struct socket *, struct page *, int of= fset, size_t size, int flags); static ssize_t unix_stream_splice_read(struct socket *, loff_t *ppos, struct pipe_inode_info *, size_t size, unsigned int flags); -static int unix_dgram_sendmsg(struct socket *, struct msghdr *, size_t); +static int unix_dgram_sendmsg(struct socket *, struct msghdr *); static int unix_dgram_recvmsg(struct socket *, struct msghdr *, size_t, in= t); static int unix_read_skb(struct sock *sk, skb_read_actor_t recv_actor); static int unix_stream_read_skb(struct sock *sk, skb_read_actor_t recv_act= or); static int unix_dgram_connect(struct socket *, struct sockaddr *, int, int); -static int unix_seqpacket_sendmsg(struct socket *, struct msghdr *, size_t= ); +static int unix_seqpacket_sendmsg(struct socket *, struct msghdr *); static int unix_seqpacket_recvmsg(struct socket *, struct msghdr *, size_t, int); =20 @@ -1888,14 +1888,14 @@ static void scm_stat_del(struct sock *sk, struct sk= _buff *skb) * Send AF_UNIX data. */ =20 -static int unix_dgram_sendmsg(struct socket *sock, struct msghdr *msg, - size_t len) +static int unix_dgram_sendmsg(struct socket *sock, struct msghdr *msg) { DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr, msg->msg_name); struct sock *sk =3D sock->sk, *other =3D NULL; struct unix_sock *u =3D unix_sk(sk); struct scm_cookie scm; struct sk_buff *skb; + size_t len =3D msg_data_left(msg); int data_len =3D 0; int sk_locked; long timeo; @@ -2157,11 +2157,11 @@ static int queue_oob(struct socket *sock, struct ms= ghdr *msg, struct sock *other } #endif =20 -static int unix_stream_sendmsg(struct socket *sock, struct msghdr *msg, - size_t len) +static int unix_stream_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct sock *other =3D NULL; + size_t len =3D msg_data_left(msg); int err, size; struct sk_buff *skb; int sent =3D 0; @@ -2388,8 +2388,7 @@ static ssize_t unix_stream_sendpage(struct socket *so= cket, struct page *page, return err; } =20 -static int unix_seqpacket_sendmsg(struct socket *sock, struct msghdr *msg, - size_t len) +static int unix_seqpacket_sendmsg(struct socket *sock, struct msghdr *msg) { int err; struct sock *sk =3D sock->sk; @@ -2404,7 +2403,7 @@ static int unix_seqpacket_sendmsg(struct socket *sock= , struct msghdr *msg, if (msg->msg_namelen) msg->msg_namelen =3D 0; =20 - return unix_dgram_sendmsg(sock, msg, len); + return unix_dgram_sendmsg(sock, msg); } =20 static int unix_seqpacket_recvmsg(struct socket *sock, struct msghdr *msg, diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c index 19aea7cba26e..20bac3e04abd 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c @@ -1131,8 +1131,7 @@ static __poll_t vsock_poll(struct file *file, struct = socket *sock, return mask; } =20 -static int vsock_dgram_sendmsg(struct socket *sock, struct msghdr *msg, - size_t len) +static int vsock_dgram_sendmsg(struct socket *sock, struct msghdr *msg) { int err; struct sock *sk; @@ -1198,7 +1197,7 @@ static int vsock_dgram_sendmsg(struct socket *sock, s= truct msghdr *msg, goto out; } =20 - err =3D transport->dgram_enqueue(vsk, remote_addr, msg, len); + err =3D transport->dgram_enqueue(vsk, remote_addr, msg, msg_data_left(msg= )); =20 out: release_sock(sk); @@ -1737,8 +1736,7 @@ static int vsock_connectible_getsockopt(struct socket= *sock, return 0; } =20 -static int vsock_connectible_sendmsg(struct socket *sock, struct msghdr *m= sg, - size_t len) +static int vsock_connectible_sendmsg(struct socket *sock, struct msghdr *m= sg) { struct sock *sk; struct vsock_sock *vsk; @@ -1794,7 +1792,7 @@ static int vsock_connectible_sendmsg(struct socket *s= ock, struct msghdr *msg, if (err < 0) goto out; =20 - while (total_written < len) { + while (msg_data_left(msg)) { ssize_t written; =20 add_wait_queue(sk_sleep(sk), &wait); @@ -1856,10 +1854,10 @@ static int vsock_connectible_sendmsg(struct socket = *sock, struct msghdr *msg, =20 if (sk->sk_type =3D=3D SOCK_SEQPACKET) { written =3D transport->seqpacket_enqueue(vsk, - msg, len - total_written); + msg, msg_data_left(msg)); } else { written =3D transport->stream_enqueue(vsk, - msg, len - total_written); + msg, msg_data_left(msg)); } =20 if (written < 0) { @@ -1882,7 +1880,7 @@ static int vsock_connectible_sendmsg(struct socket *s= ock, struct msghdr *msg, * 1) SOCK_STREAM socket. * 2) SOCK_SEQPACKET socket when whole buffer is sent. */ - if (sk->sk_type =3D=3D SOCK_STREAM || total_written =3D=3D len) + if (sk->sk_type =3D=3D SOCK_STREAM || !msg_data_left(msg)) err =3D total_written; } out: diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c index 5c7ad301d742..5b8751669136 100644 --- a/net/x25/af_x25.c +++ b/net/x25/af_x25.c @@ -1100,7 +1100,7 @@ int x25_rx_call_request(struct sk_buff *skb, struct x= 25_neigh *nb, goto out; } =20 -static int x25_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) +static int x25_sendmsg(struct socket *sock, struct msghdr *msg) { struct sock *sk =3D sock->sk; struct x25_sock *x25 =3D x25_sk(sk); @@ -1108,6 +1108,7 @@ static int x25_sendmsg(struct socket *sock, struct ms= ghdr *msg, size_t len) struct sockaddr_x25 sx25; struct sk_buff *skb; unsigned char *asmptr; + size_t len =3D msg_data_left(msg); int noblock =3D msg->msg_flags & MSG_DONTWAIT; size_t size; int qbit =3D 0, rc =3D -EINVAL; diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c index 2ac58b282b5e..db82e2a287f5 100644 --- a/net/xdp/xsk.c +++ b/net/xdp/xsk.c @@ -629,7 +629,7 @@ static int xsk_check_common(struct xdp_sock *xs) return 0; } =20 -static int __xsk_sendmsg(struct socket *sock, struct msghdr *m, size_t tot= al_len) +static int __xsk_sendmsg(struct socket *sock, struct msghdr *m) { bool need_wait =3D !(m->msg_flags & MSG_DONTWAIT); struct sock *sk =3D sock->sk; @@ -663,12 +663,12 @@ static int __xsk_sendmsg(struct socket *sock, struct = msghdr *m, size_t total_len return 0; } =20 -static int xsk_sendmsg(struct socket *sock, struct msghdr *m, size_t total= _len) +static int xsk_sendmsg(struct socket *sock, struct msghdr *m) { int ret; =20 rcu_read_lock(); - ret =3D __xsk_sendmsg(sock, m, total_len); + ret =3D __xsk_sendmsg(sock, m); rcu_read_unlock(); =20 return ret; diff --git a/net/xfrm/espintcp.c b/net/xfrm/espintcp.c index 872b80188e83..d07faa356347 100644 --- a/net/xfrm/espintcp.c +++ b/net/xfrm/espintcp.c @@ -311,13 +311,14 @@ int espintcp_push_skb(struct sock *sk, struct sk_buff= *skb) } EXPORT_SYMBOL_GPL(espintcp_push_skb); =20 -static int espintcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t si= ze) +static int espintcp_sendmsg(struct sock *sk, struct msghdr *msg) { long timeo =3D sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); struct espintcp_ctx *ctx =3D espintcp_getctx(sk); struct espintcp_msg *emsg =3D &ctx->partial; struct iov_iter pfx_iter; struct kvec pfx_iov =3D {}; + size_t size =3D msg_data_left(msg); size_t msglen =3D size + 2; char buf[2] =3D {0}; int err, end; @@ -325,7 +326,7 @@ static int espintcp_sendmsg(struct sock *sk, struct msg= hdr *msg, size_t size) if (msg->msg_flags & ~MSG_DONTWAIT) return -EOPNOTSUPP; =20 - if (size > MAX_ESPINTCP_MSG) + if (msg_data_left(msg) > MAX_ESPINTCP_MSG) return -EMSGSIZE; =20 if (msg->msg_controllen) @@ -362,7 +363,8 @@ static int espintcp_sendmsg(struct sock *sk, struct msg= hdr *msg, size_t size) if (err < 0) goto fail; =20 - err =3D sk_msg_memcopy_from_iter(sk, &msg->msg_iter, &emsg->skmsg, size); + err =3D sk_msg_memcopy_from_iter(sk, &msg->msg_iter, &emsg->skmsg, + msg_data_left(msg)); if (err < 0) goto fail; =20 diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c index d6cc4812ca53..cb220a8e8126 100644 --- a/security/apparmor/lsm.c +++ b/security/apparmor/lsm.c @@ -997,10 +997,10 @@ static int aa_sock_msg_perm(const char *op, u32 reque= st, struct socket *sock, /** * apparmor_socket_sendmsg - check perms before sending msg to another soc= ket */ -static int apparmor_socket_sendmsg(struct socket *sock, - struct msghdr *msg, int size) +static int apparmor_socket_sendmsg(struct socket *sock, struct msghdr *msg) { - return aa_sock_msg_perm(OP_SENDMSG, AA_MAY_SEND, sock, msg, size); + return aa_sock_msg_perm(OP_SENDMSG, AA_MAY_SEND, sock, msg, + msg_data_left(msg)); } =20 /** diff --git a/security/security.c b/security/security.c index cf6cc576736f..faa87f363af8 100644 --- a/security/security.c +++ b/security/security.c @@ -2301,9 +2301,9 @@ int security_socket_accept(struct socket *sock, struc= t socket *newsock) return call_int_hook(socket_accept, 0, sock, newsock); } =20 -int security_socket_sendmsg(struct socket *sock, struct msghdr *msg, int s= ize) +int security_socket_sendmsg(struct socket *sock, struct msghdr *msg) { - return call_int_hook(socket_sendmsg, 0, sock, msg, size); + return call_int_hook(socket_sendmsg, 0, sock, msg); } =20 int security_socket_recvmsg(struct socket *sock, struct msghdr *msg, diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 9a5bdfc21314..ff0d82e6331d 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -4912,8 +4912,7 @@ static int selinux_socket_accept(struct socket *sock,= struct socket *newsock) return 0; } =20 -static int selinux_socket_sendmsg(struct socket *sock, struct msghdr *msg, - int size) +static int selinux_socket_sendmsg(struct socket *sock, struct msghdr *msg) { return sock_has_perm(sock->sk, SOCKET__WRITE); } diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index cfcbb748da25..ca30c105f254 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -3730,14 +3730,12 @@ static int smack_unix_may_send(struct socket *sock,= struct socket *other) * smack_socket_sendmsg - Smack check based on destination host * @sock: the socket * @msg: the message - * @size: the size of the message * * Return 0 if the current subject can write to the destination host. * For IPv4 this is only a question if the destination is a single label h= ost. * For IPv6 this is a check against the label of the port. */ -static int smack_socket_sendmsg(struct socket *sock, struct msghdr *msg, - int size) +static int smack_socket_sendmsg(struct socket *sock, struct msghdr *msg) { struct sockaddr_in *sip =3D (struct sockaddr_in *) msg->msg_name; #if IS_ENABLED(CONFIG_IPV6) diff --git a/security/tomoyo/common.h b/security/tomoyo/common.h index ca285f362705..0841098d966a 100644 --- a/security/tomoyo/common.h +++ b/security/tomoyo/common.h @@ -997,8 +997,7 @@ int tomoyo_socket_bind_permission(struct socket *sock, = struct sockaddr *addr, int tomoyo_socket_connect_permission(struct socket *sock, struct sockaddr *addr, int addr_len); int tomoyo_socket_listen_permission(struct socket *sock); -int tomoyo_socket_sendmsg_permission(struct socket *sock, struct msghdr *m= sg, - int size); +int tomoyo_socket_sendmsg_permission(struct socket *sock, struct msghdr *m= sg); int tomoyo_supervisor(struct tomoyo_request_info *r, const char *fmt, ...) __printf(2, 3); int tomoyo_update_domain(struct tomoyo_acl_info *new_entry, const int size, diff --git a/security/tomoyo/network.c b/security/tomoyo/network.c index 8dc61335f65e..0315b335cdff 100644 --- a/security/tomoyo/network.c +++ b/security/tomoyo/network.c @@ -751,12 +751,10 @@ int tomoyo_socket_bind_permission(struct socket *sock= , struct sockaddr *addr, * * @sock: Pointer to "struct socket". * @msg: Pointer to "struct msghdr". - * @size: Unused. * * Returns 0 on success, negative value otherwise. */ -int tomoyo_socket_sendmsg_permission(struct socket *sock, struct msghdr *m= sg, - int size) +int tomoyo_socket_sendmsg_permission(struct socket *sock, struct msghdr *m= sg) { struct tomoyo_addr_info address; const u8 family =3D tomoyo_sock_family(sock->sk); diff --git a/security/tomoyo/tomoyo.c b/security/tomoyo/tomoyo.c index af04a7b7eb28..72c6f343ffba 100644 --- a/security/tomoyo/tomoyo.c +++ b/security/tomoyo/tomoyo.c @@ -489,14 +489,12 @@ static int tomoyo_socket_bind(struct socket *sock, st= ruct sockaddr *addr, * * @sock: Pointer to "struct socket". * @msg: Pointer to "struct msghdr". - * @size: Size of message. * * Returns 0 on success, negative value otherwise. */ -static int tomoyo_socket_sendmsg(struct socket *sock, struct msghdr *msg, - int size) +static int tomoyo_socket_sendmsg(struct socket *sock, struct msghdr *msg) { - return tomoyo_socket_sendmsg_permission(sock, msg, size); + return tomoyo_socket_sendmsg_permission(sock, msg); } =20 struct lsm_blob_sizes tomoyo_blob_sizes __lsm_ro_after_init =3D {